]> github.com/historicalsource and other repositories - sorcerer.git/commitdiff
Final Revision
authorhistoricalsource <historicalsoftware@textfiles.com>
Sun, 14 Apr 2019 01:15:11 +0000 (21:15 -0400)
committerhistoricalsource <historicalsoftware@textfiles.com>
Sun, 14 Apr 2019 01:15:11 +0000 (21:15 -0400)
37 files changed:
archive/code.rno [new file with mode: 0644]
archive/sorcerer.beta [new file with mode: 0644]
archive/sorcerer.gamma [new file with mode: 0644]
belboz.zap [new file with mode: 0644]
belboz.zil
coal.zap [new file with mode: 0644]
end.zap [new file with mode: 0644]
end.zil
fort.zap [new file with mode: 0644]
globals.zap [new file with mode: 0644]
globals.zil
gparser.zap [new file with mode: 0644]
gparser.zil [new file with mode: 0644]
guild.zap [new file with mode: 0644]
guild.zil
magic.cmp [new file with mode: 0644]
magic.txt [new file with mode: 0644]
maze.zap [new file with mode: 0644]
misc.zap [new file with mode: 0644]
misc.zil
park.zap [new file with mode: 0644]
parser.cmp [new file with mode: 0644]
parser.zap [new file with mode: 0644]
parser.zil
sorcerer.errors [new file with mode: 0644]
sorcerer.record [new file with mode: 0644]
sorcerer.xzap [new file with mode: 0644]
sorcerer.zap [new file with mode: 0644]
sorcerer.zil
sorcerer.zip
sorcererdat.zap [new file with mode: 0644]
sorcererfreq.xzap [new file with mode: 0644]
sorcererstr.zap [new file with mode: 0644]
syntax.zap [new file with mode: 0644]
syntax.zil
verbs.zap [new file with mode: 0644]
verbs.zil

diff --git a/archive/code.rno b/archive/code.rno
new file mode 100644 (file)
index 0000000..f1115d5
--- /dev/null
@@ -0,0 +1,212 @@
+.c;INFOTATER TEXT
+.s 4
+This is the copy for the "infotater" -- the rotating data wheel which
+will be included in the game package. It is also an object which appears
+in the game. It is important to the play of the game, and is meant as an
+anti-piracy device.
+.s
+.c;SEM, 1/5/84
+
+.pg
+.lm 18
+.rm 62
+.c;BLOODWORM
+.s
+Found in shallow underground pools; often mistaken for mossy boulders.
+Pointy, retractable fangs can extend up to 32". Most bloodworms are
+repelled by the smell of boiled chives. Bloodworms are usually white -
+gray - black - red - black.
+.s 3
+.s
+.c;BROGMOID
+.s
+In rare cases, these squat creatures can achieve intelligence level of a
+3-year-old human. Often seen in wild foraging in huge packs for edible
+rocks. Live much longer in captivity; can even be trained to perform
+simple tasks. Usually red - purple - red - black - purple.
+.s 3
+.c;DORN
+.s
+Can paralyze with a single glare from its powerful eyes (range: roughly
+3' for young beasts to 20' for adults). Dorns commonly inhabit crags and
+shadows near cliff bases. According to the last words of dying
+explorers, dorn beasts are gray - purple - black - gray - white.
+.s 3
+.c;DRYAD
+.s
+Also called "tree sprite". Beautiful, shy. Many spend lifetime under one
+tree. If coaxed, may reveal location of forest treasures. Will fight
+only in self defense and only in large numbers, pelting foes with tons
+of rose petals. When awake, dryads are black - gray - white - red - red.
+
+.PG
+.c;GRUE
+.s
+A sinister, lurking presence in the dark places of the earth. Favorite
+snack is unwary Enchanters. Fears light: No grue has ever been seen by
+the light of day. Toxicologists believe that grues are probably black -
+black - red - black - purple.
+.s 3
+.c;HELLHOUND
+.s
+Fast, fierce, and capable of devouring a human 12 times its size in 3.5
+seconds. Normally inhabits burnt-out or enchanted woods and rarely
+ventures beyond its own turf, even in pursuit of prey. Hellhounds are
+purple - white - gray - red - gray.
+.s 3
+.c;KOBOLD
+.s
+Lives in small tribes in caverns and very dark forests. Similar to
+paskald, except middle toe is shorter than toes that flank it; also, far
+more belligerent. If attacked, will fight back; if not attacked, will
+fight back anyway. Coloration: red - purple - black - purple - red.
+.s 3
+.c;NABIZ
+.s
+A nabiz is mostly mouth, and that mouth is mostly teeth. Instinctively
+attack's enemy's weak point. Contrary to folk lore, cannot fly, but
+leaps vast distances. Is repulsed by the color blue; hence that color's
+popularity in adventurers' garb. Nabiz are purple - black - black -
+black - red.
+
+.pg
+.c;ORC
+Erstwhile warring race who became civilized through their fondness for
+computer adventure games. Although a small fraction (Hi-Res Orcs) enjoy
+graphics adventures, the vast majority (Orcs of Zork) prefer text games.
+By the light of a CRT screen, orcs are red - gray - purple - gray - red.
+.s 3
+.c;ROTGRUB
+.s
+Less than 1" long; smells like very cheap old cheese; impervious to all
+forms of magic. Hides in food until ingested, then burrows straight to
+victim's brain and feeds for years before death mercifully arrives.
+Common household rotgrubs are gray - red - gray - purple - red.
+.s 3
+.c;SURMIN
+.s
+Characterized by malodorous breath, lice-ridden fur, and general
+repulsiveness. If allowed to approach close enough, can bore its victims
+to death by reciting Greater Borphee County Penal Codes. A newly-shaved
+surmin is black - black - purple - red - black.
+.s 3
+.c;YIPPLE
+.s
+Master of disguise, able to change form. In the wild, may bite if
+disturbed. Violently allergic to many kinds of animal wastes. Tame
+yipples make wonderful pets, but should be kept out of cookie jar when
+guests visit. On a white background, yipples look gray - purple - white
+- purple - black.
+
+.pg
+.LM 18
+.RM 62
+.c;BLOODWORM
+.s
+Bloodworms live in shallow underground pools of water, often appearing
+as mossy boulders to an unwary observer. Their pointy, retractable fangs
+can extend up to 32 inches when attacking a victim. Most bloodworms are
+repelled by the taste and smell of boiled chives; always carry some if
+you plan on venturing near known bloodworm spawning grounds. Bloodworms
+are usually white and gray and black and red and gray.
+.s 2
+.c;BROGMOID
+.s
+Brogmoids are squat creatures who can, in rare cases, achieve the
+intelligence of a three-year-old human. If raised from birth in a
+domestic setting, a brogmoid will be quite tame and can even be taught
+to perform simple tasks. In the wild, brogmoids can be seen in huge
+packs sorting through rock piles looking for edible rocks. Brogmoids,
+which live considerably longer in captivity, are red and purple and red
+and black and purple.
+.s 2
+.c;DORN
+.s
+Dorn beasts are very deadly and should be avoided at all costs. They
+generally live in crags and shadows near cliff bases. A dorn beast can
+paralyze its victim with a single glare from its powerful eyes. A dorn
+beast stare has a range of about three feet in a young dorn beastling up
+to about twenty feet in a full grown dorn. According to the last words
+of dying explorers, dorn beasts are gray and purple and black and gray
+and white.
+.s 2
+.c;DRYAD
+.s
+Dryads, also known as tree sprites, are beautiful and shy. They can
+frequently live their entire lives without stepping out of the shade of
+the tree they were born under. Dryads, if coaxed, can reveal the
+location of forest treasures. They are only dangerous in large numbers,
+and then only if threatened. In these circumstances, they have been
+known to crush their attackers under tons and tons of rose petals.
+Dryads, when awake, are black and gray and white and red and red.
+
+.pg
+.C;GRUE
+.s
+The grue is a sinister, lurking presence in the dark places of the
+earth. Its favorite diet is Enchanters, but its insatiable appetite is
+tempered by its fear of light. No grue has ever been seen by the light
+of day, and few have survived to tell the tale. Grues are probably black
+and black and red and black and purple.
+.s 2
+.c;HELLHOUND
+.s
+The best thing to do when you spot a hellhound is to run as fast as
+possible in the other direction. Hellhounds are fast, ferocious,
+merciless, and capable of devouring a human 12 times its size in
+three-and-one-half seconds. They normally live in burned-out or
+enchanted woods, and rarely venture beyond their turf, even in pursuit
+of prey. Hellhounds are purple and white and gray and red and gray.
+.s 2 
+.c;KOBOLD
+.s
+Kobolds, who live in small tribes in caverns or very dark forests, are
+extremely capable fighters. If attacked, they will fight back. If not
+attacked, they will fight back anyway. Kobolds look very similar to the
+less aggressive paskalds, but can be immediately identified by the fact
+that their middle toes are slightly shorter than the toes which flank
+it. Kobolds are red and purple and black and purple and red.
+.s 2
+.c;NABIZ
+.s
+Nabiz are mostly mouth, and that mouth is mostly teeth. Nabiz always
+instinctively know exactly what their enemy's weakest point is, and
+attack there. Contrary to popular folk lore, they cannot fly, but they
+can leap tremendous distances. Nabiz are repulsed by the color blue,
+which explains the popularity of this color among adventurer's garb.
+Common nabiz are purple and black and black and black and red.
+
+.pg
+.c;ORC
+.s
+Once a fearsome race of warriors, the orcs were tamed by their fondness
+for computerized adventure games. Although a small segment, known as the
+Hi-Res Orcs, enjoy graphic adventurers, the vast majority prefer text
+games. These are known as the Orcs of Zork. In the reflected light of a
+CRT screen, orcs appear to be red and gray and purple and gray and red.
+.s 2
+.c;ROTGRUB
+.s
+The rotgrub is less than an inch long, and lies waiting in food. Once
+ingested, the rotgrub heads straight for the brain and begins feeding.
+Rotgrub death is excrutiatingly painful and can last years. Worse yet,
+these pests are totally impervious to all forms of magic, and smell like
+very old cheeses. A common house rotgrub is gray and red and gray and
+purple and red.
+.s 2
+.c;SURMIN
+.s
+From their malodorous breath to their lice-ridden fur, surmins are
+utterly repulsive creatures. If they can get close enough, they can bore
+their victim to death by reciting New Jersey State Penal Codes. A newly
+shaven surmin is black and black and purple and red and purple.
+.s 2
+.c;YIPPLE
+.s
+The yipple is a master of disguise. As the chameleon is to color, so is
+the yipple to shape and form. Some yipples, if disturbed in the wild,
+may bite. Domesticated, they make wonderful pets, but should never be
+allowed to rest in the cookie jar if guests are expected. Yipples are
+violently allergic to many kinds of animal wastes. A yipple, if placed
+on a plain white tablecloth, becomes gray and purple and white and
+purple and black.
\ No newline at end of file
diff --git a/archive/sorcerer.beta b/archive/sorcerer.beta
new file mode 100644 (file)
index 0000000..4bb88f3
Binary files /dev/null and b/archive/sorcerer.beta differ
diff --git a/archive/sorcerer.gamma b/archive/sorcerer.gamma
new file mode 100644 (file)
index 0000000..96c7a09
Binary files /dev/null and b/archive/sorcerer.gamma differ
diff --git a/belboz.zap b/belboz.zap
new file mode 100644 (file)
index 0000000..69a0773
--- /dev/null
@@ -0,0 +1,985 @@
+
+
+       .FUNCT  I-WAKE-UP
+       CALL    JIGS-UP,STR?190
+       RSTACK  
+
+
+       .FUNCT  TREE-F
+       EQUAL?  PRSA,V?CLIMB-UP,V?CLIMB-FOO \?ELS5
+       CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?CLIMB-DOWN \?ELS7
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS7: EQUAL?  PRSA,V?LOOK-UNDER \?ELS9
+       CALL    PERFORM,V?EXAMINE,GROUND
+       RTRUE   
+?ELS9: EQUAL?  PRSA,V?MEEF \FALSE
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,V?MEEF,FOREST
+       RTRUE   
+
+
+       .FUNCT  HELLHOUND-F
+       EQUAL?  PRSA,V?RESEARCH \FALSE
+       CALL    PERFORM,V?RESEARCH,LOBBY
+       RTRUE   
+
+
+       .FUNCT  I-HELLHOUND
+       EQUAL?  HERE,TWISTED-FOREST \?ELS5
+       ZERO?   HELLHOUND-WARNING /?ELS10
+       CALL    JIGS-UP,STR?192
+       RSTACK  
+?ELS10:        SET     'HELLHOUND-WARNING,TRUE-VALUE
+       CRLF    
+       PRINTR  "A hellhound is racing straight toward you, its open jaws displaying rows of razor-sharp teeth."
+?ELS5: EQUAL?  HERE,TREE-BRANCH \?ELS17
+       PRINTR  "The hellhound leaps madly about the base of the tree, gnashing its jaws."
+?ELS17:        MOVE    HELLHOUND,DIAL
+       CALL    INT,I-HELLHOUND
+       PUT     STACK,0,0
+       PRINTR  "The hellhound stops at the edge of the forest and bellows. After a moment, it turns and slinks into the trees."
+
+
+       .FUNCT  TREE-BRANCH-F,RARG
+       EQUAL?  RARG,M-LOOK \?ELS5
+       PRINTI  "You are "
+       ZERO?   FLYING /?ELS10
+       PRINTI  "flying near"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "on"
+?CND8: PRINTR  " a large gnarled branch of an old and twisted tree."
+?ELS5: EQUAL?  RARG,M-ENTER \FALSE
+       CALL    QUEUE,I-BOA,-1
+       PUT     STACK,0,1
+       RFALSE  
+
+
+       .FUNCT  TREE-UP-F
+       PRINTI  "You can't "
+       ZERO?   FLYING /?ELS5
+       PRINTI  "fly"
+       JUMP    ?CND3
+?ELS5: PRINTI  "climb"
+?CND3: PRINTI  " any higher."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  BOA-F
+       EQUAL?  PRSA,V?EXAMINE \FALSE
+       PRINTR  "Your average giant carnivorous snake -- except that this one has three heads and an appetite to match."
+
+
+       .FUNCT  I-BOA
+       EQUAL?  HERE,TREE-BRANCH \?ELS5
+       ZERO?   FLYING \FALSE
+       ZERO?   BOA-WARNING /?ELS13
+       CALL    JIGS-UP,STR?193
+       RSTACK  
+?ELS13:        SET     'BOA-WARNING,TRUE-VALUE
+       CRLF    
+       PRINTR  "A giant boa constrictor is slithering along the branch toward you!"
+?ELS5: SET     'BOA-WARNING,FALSE-VALUE
+       CALL    INT,I-BOA
+       PUT     STACK,0,0
+       RFALSE  
+
+
+       .FUNCT  FENCE-PSEUDO
+       EQUAL?  PRSA,V?LEAP,V?CLIMB-FOO,V?CLIMB-OVER \FALSE
+       PRINTR  "It's too tall."
+
+
+       .FUNCT  SIGNPOST-F
+       EQUAL?  PRSA,V?READ \FALSE
+       CALL    FIXED-FONT-ON
+       PRINTI  "
+""  *** !!! >>> WARNING <<< !!! ***
+     This path is protected by a
+          Magic Mine Field
+          installed by the
+   Frobozz Magic Mine Field Company"
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  MINE-FIELD-EXIT-F
+       EQUAL?  PRSO,P?SOUTH \?ELS5
+       RANDOM  100
+       LESS?   50,STACK /?ELS5
+       RETURN  FOREST-EDGE
+?ELS5: ZERO?   FLYING /?CND10
+       PRINTI  "Unfortunately, one of the properties of magic mine fields is their ability to blow you up even if you're floating above them. "
+?CND10:        CALL    JIGS-UP,STR?198
+       RFALSE  
+
+
+       .FUNCT  SNAKE-PIT-PSEUDO
+       EQUAL?  PRSA,V?THROUGH \FALSE
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+
+
+       .FUNCT  CRACK-PSEUDO
+       EQUAL?  PRSA,V?THROUGH \FALSE
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+
+
+       .FUNCT  SNAKE-PIT-F,RARG
+       EQUAL?  RARG,M-ENTER \FALSE
+       RANDOM  3
+       ADD     1,STACK
+       CALL    QUEUE,I-SNAKE-PIT,STACK
+       PUT     STACK,0,1
+       RFALSE  
+
+
+       .FUNCT  I-SNAKE-PIT
+       EQUAL?  HERE,SNAKE-PIT \?ELS5
+       CALL    JIGS-UP,STR?200
+       RSTACK  
+?ELS5: CALL    INT,I-SNAKE-PIT
+       PUT     STACK,0,0
+       RTRUE   
+
+
+       .FUNCT  MOSS-F
+       EQUAL?  PRSA,V?MEEF \?ELS5
+       PRINTR  "A few patches of the moss and lichens become brown and dry."
+?ELS5: EQUAL?  PRSA,V?EAT \FALSE
+       CALL    JIGS-UP,STR?202
+       RSTACK  
+
+
+       .FUNCT  MEADOW-F,RARG
+       EQUAL?  RARG,M-ENTER \?ELS5
+       CALL    QUEUE,I-LOCUSTS,-1
+       PUT     STACK,0,1
+       RFALSE  
+?ELS5: EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "You are in the center of a "
+       IN?     MEADOW-OBJECT,HERE \?ELS12
+       PRINTI  "rolling meadow of tall grass"
+       JUMP    ?CND10
+?ELS12:        PRINTI  "barren field"
+?CND10:        PRINTR  ". To the east is the turret of a ruined castle, and from the northeast comes the sound of rushing water."
+
+
+       .FUNCT  MEADOW-OBJECT-F
+       EQUAL?  HERE,MEADOW /?ELS5
+       EQUAL?  PRSA,V?MEEF,V?RUB \?ELS5
+       PRINTR  "The meadow is too far away."
+?ELS5: EQUAL?  PRSA,V?MEEF \FALSE
+       MOVE    MEADOW-OBJECT,DIAL
+       PRINTR  "The grass vanishes as far as the eye can see."
+
+
+       .FUNCT  PLAGUE-OF-LOCUSTS-F
+       EQUAL?  PRSA,V?LOOK-UNDER \FALSE
+       CALL    PERFORM,V?EXAMINE,MEADOW-OBJECT
+       RTRUE   
+
+
+       .FUNCT  I-LOCUSTS
+       EQUAL?  HERE,MEADOW /?ELS5
+       CALL    INT,I-LOCUSTS
+       PUT     STACK,0,0
+       SET     'LOCUST-WARNING,0
+       RFALSE  
+?ELS5: ZERO?   LOCUST-WARNING \?ELS7
+       INC     'LOCUST-WARNING
+       CRLF    
+       PRINTR  "A swarm of bloodsucking locusts appears on the horizon."
+?ELS7: EQUAL?  LOCUST-WARNING,1 \?ELS11
+       INC     'LOCUST-WARNING
+       CRLF    
+       PRINTR  "The locusts are much closer now, blotting out the sun like a black storm cloud."
+?ELS11:        SET     'LOCUST-WARNING,0
+       CALL    JIGS-UP,STR?203
+       RSTACK  
+
+
+       .FUNCT  RIVER-BANK-F,RARG
+       EQUAL?  RARG,M-LOOK \?ELS5
+       PRINTI  "You are on a muddy bank "
+       ZERO?   RIVER-EVAPORATED /?ELS10
+       PRINTI  "above a dried-up river bed"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "of a fast-moving river, full of sharp rocks and foaming rapids, flowing to the southwest. The ground is soft and eroded, and continually threatens to dump you into the turbulent waters"
+?CND8: PRINTR  ". A field lies to the southwest, and a trail leads southeast along the bank."
+?ELS5: EQUAL?  RARG,M-END \FALSE
+       LESS?   BANK-COUNTER,3 \?ELS26
+       INC     'BANK-COUNTER
+       RFALSE  
+?ELS26:        ZERO?   RIVER-EVAPORATED \FALSE
+       ZERO?   FLYING \FALSE
+       RANDOM  100
+       LESS?   75,STACK /FALSE
+       CALL    JIGS-UP,STR?205
+       RSTACK  
+
+
+       .FUNCT  ROCK-PSEUDO
+       EQUAL?  PRSA,V?CROSS \FALSE
+       CALL    PICK-ONE,YUKS
+       PRINT   STACK
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  RIVER-ENTER-F
+       ZERO?   RIVER-EVAPORATED /?ELS5
+       RETURN  RIVER-BED
+?ELS5: ZERO?   FLYING /?ELS8
+       CALL    JIGS-UP,STR?206
+       RFALSE  
+?ELS8: PRINTI  "You'd never survive the rapids."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  RIVER-F
+       EQUAL?  HERE,GUN-EMPLACEMENT,TURRET \?ELS5
+       PRINTR  "The river lies far below."
+?ELS5: ZERO?   RIVER-EVAPORATED /?ELS9
+       PRINTR  "River? What river?"
+?ELS9: EQUAL?  PRSA,V?DRINK-FROM,V?DRINK \?ELS14
+       CALL    PERFORM,V?DRINK,WATER
+       RTRUE   
+?ELS14:        EQUAL?  PRSA,V?PULVER \?ELS16
+       EQUAL?  HERE,RIVER-BANK \?ELS21
+       SET     'RIVER-EVAPORATED,TRUE-VALUE
+       CALL    QUEUE,I-TRICKLE,3
+       PUT     STACK,0,1
+       PRINTR  "The river dries up, leaving only a few puddles between the rocks! It's now safe to climb down into the river bed."
+?ELS21:        PRINTR  "The water level drops several feet, but quickly surges back."
+?ELS16:        EQUAL?  PRSA,V?EXAMINE \?ELS29
+       PRINTR  "The river flows quickly by below you."
+?ELS29:        EQUAL?  PRSA,V?PUT \?ELS33
+       EQUAL?  RIVER,PRSI \?ELS33
+       MOVE    PRSO,DIAL
+       CALL    SPLASH
+       RSTACK  
+?ELS33:        EQUAL?  PRSA,V?THROUGH \FALSE
+       CALL    DO-WALK,P?NORTH
+       RSTACK  
+
+
+       .FUNCT  I-TRICKLE
+       CALL    QUEUE,I-FLOOD,2
+       PUT     STACK,0,1
+       EQUAL?  HERE,RIVER-BANK,RIVER-BED /?THN6
+       EQUAL?  HERE,STAGNANT-POOL,TOP-OF-FALLS \FALSE
+?THN6: CRLF    
+       PRINTR  "A trickle of water begins flowing down the center of the river bed."
+
+
+       .FUNCT  I-FLOOD
+       SET     'RIVER-EVAPORATED,FALSE-VALUE
+       CALL    FLOOD-LOOP,RIVER-BED
+       CALL    FLOOD-LOOP,STAGNANT-POOL
+       CALL    FLOOD-LOOP,TOP-OF-FALLS
+       CRLF    
+       EQUAL?  HERE,STAGNANT-POOL,RIVER-BED,TOP-OF-FALLS \?ELS5
+       CALL    JIGS-UP,STR?207
+       RSTACK  
+?ELS5: EQUAL?  HERE,RIVER-BANK \?ELS7
+       PRINTR  "A wall of water rushes down the river bed as the river returns with a vengeance."
+?ELS7: EQUAL?  HERE,HIDDEN-CAVE \FALSE
+       PRINTR  "There is a roar of water from outside the cave. The lower part of the cave, near the mouth, fills with a pool of swirling water!"
+
+
+       .FUNCT  FLOOD-LOOP,LOC,X,N
+       FIRST?  LOC >X /?KLU14
+?KLU14:        ZERO?   X /TRUE
+?PRG4: NEXT?   X >N /?KLU15
+?KLU15:        EQUAL?  X,PROTAGONIST /?CND6
+       MOVE    X,DIAL
+?CND6: ZERO?   N /TRUE
+       SET     'X,N
+       JUMP    ?PRG4
+
+
+       .FUNCT  UNDERGROWTH-F
+       EQUAL?  PRSA,V?MEEF \FALSE
+       PRINTR  "The nearest part of the undergrowth withers away ... revealing more undergrowth."
+
+
+       .FUNCT  BANKS-F
+       EQUAL?  PRSA,V?CLIMB-FOO,V?CLIMB-DOWN,V?CLIMB-UP \FALSE
+       CALL    V-WALK-AROUND
+       RSTACK  
+
+
+       .FUNCT  RIVER-BED-OBJECT-F
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       EQUAL?  HERE,RIVER-BANK \?ELS10
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS10:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?EXIT,V?DROP \FALSE
+       EQUAL?  HERE,RIVER-BANK \?ELS19
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS19:        CALL    DO-WALK,P?UP
+       RSTACK  
+
+
+       .FUNCT  RIVER-BED-F,RARG
+       EQUAL?  RARG,M-ENTER \FALSE
+       PUT     VEZZAS,1,0
+       RFALSE  
+
+
+       .FUNCT  PUDDLE-PSEUDO
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       PRINTR  "The puddles are very shallow."
+?ELS5: EQUAL?  PRSA,V?PULVER \FALSE
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,V?PULVER,WATER
+       RTRUE   
+
+
+       .FUNCT  FISH-PSEUDO
+       EQUAL?  PRSA,V?TAKE \FALSE
+       PRINTR  "They squirm from your grasp."
+
+
+       .FUNCT  TENTACLE-DEATH
+       ZERO?   FLYING /?ELS3
+       PRINTI  "You fly over the surface of the pool."
+       JUMP    ?CND1
+?ELS3: PRINTI  "You wade into the stagnant pool."
+?CND1: CALL    JIGS-UP,STR?210
+       RFALSE  
+
+
+       .FUNCT  RIVER-EXIT-F
+       PRINTI  "The banks are too "
+       ZERO?   FLYING /?ELS5
+       PRINTI  "high to fly over."
+       CRLF    
+       RFALSE  
+?ELS5: PRINTI  "steep to climb."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  WATERFALL-EXIT-F
+       ZERO?   FLYING /?ELS3
+       PRINTI  "That would be foolhardy, as flying spells are of limited duration."
+       CRLF    
+       RFALSE  
+?ELS3: PRINTI  "That would involve quite a plunge."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  TOP-OF-CLIFF-PSEUDO
+       EQUAL?  PRSA,V?CLIMB-DOWN \?ELS5
+       PRINTR  "Impossible."
+?ELS5: EQUAL?  PRSA,V?LEAP \FALSE
+       CALL    JIGS-UP,STR?212
+       RSTACK  
+
+
+       .FUNCT  HAZE-PSEUDO
+       EQUAL?  PRSA,V?RUB \FALSE
+       PRINTR  "From here?"
+
+
+       .FUNCT  WATERFALL-F
+       EQUAL?  PRSA,V?EXAMINE \?ELS5
+       PRINTR  "It's no Aragain Falls, but it's pretty impressive."
+?ELS5: EQUAL?  PRSA,V?LEAP \?ELS9
+       EQUAL?  HERE,TOP-OF-FALLS \?ELS9
+       SET     'PRSO,FALSE-VALUE
+       CALL    PERFORM,V?LEAP
+       RTRUE   
+?ELS9: EQUAL?  HERE,MOUTH-OF-RIVER,TURRET \FALSE
+       EQUAL?  PRSA,V?SMELL,V?RUB,V?LEAP /?THN16
+       EQUAL?  PRSA,V?LISTEN \FALSE
+?THN16:        PRINTR  "From here?"
+
+
+       .FUNCT  HIDDEN-CAVE-F,RARG
+       EQUAL?  RARG,M-ENTER \?ELS5
+       FSET?   HIDDEN-CAVE,TOUCHBIT /?ELS5
+       ADD     SCORE,20 >SCORE
+       RETURN  SCORE
+?ELS5: EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "This is a hollow area under the northeast bank of the river. The floor rises away from the mouth of the cave, which is at its southwest end. "
+       ZERO?   RIVER-EVAPORATED \?CND12
+       PRINTI  "The mouth is filled with a pool of swirling water. "
+?CND12:        PRINTR  "A dark hole leads downward at the far end of the cave."
+
+
+       .FUNCT  BAT-GUANO-F
+       EQUAL?  PRSA,V?TAKE \FALSE
+       FSET?   FWEEP-SCROLL,TOUCHBIT /FALSE
+       FSET    FWEEP-SCROLL,TOUCHBIT
+       FSET    BAT-GUANO,TOUCHBIT
+       FCLEAR  BAT-GUANO,TRYTAKEBIT
+       FCLEAR  BAT-GUANO,NDESCBIT
+       MOVE    BAT-GUANO,PROTAGONIST
+       PRINTR  "As you take the guano, the soiled scroll falls to the ground."
+
+
+       .FUNCT  BLORT-VIAL-F
+       EQUAL?  PRSA,V?READ \FALSE
+       CALL    FIXED-FONT-ON
+       PRINTI  "
+        ""BLORT POTION
+(ability to see in dark places)"""
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  BLORT-POTION-F
+       EQUAL?  PRSA,V?DRINK,V?EAT \?ELS5
+       CALL    HELD?,BLORT-VIAL
+       ZERO?   STACK \?ELS5
+       CALL    POTION-POUR,BLORT-VIAL
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?RESEARCH \?ELS9
+       CALL    READ-ABOUT-POTIONS,1
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?DRINK,V?EAT \?ELS11
+       MOVE    BLORT-POTION,DIAL
+       ZERO?   UNDER-INFLUENCE /?CND12
+       CALL    TWO-POTIONS
+       RTRUE   
+?CND12:        CALL    QUEUE,I-UNBLORT,24
+       PUT     STACK,0,1
+       SET     'BLORTED,TRUE-VALUE
+       SET     'UNDER-INFLUENCE,BLORT-POTION
+       PRINTR  "The amber potion tasted like chives, and made your eyes tingle."
+?ELS11:        EQUAL?  PRSA,V?DROP \?ELS19
+       CALL    PERFORM,V?POUR,PRSO,PRSI
+       RTRUE   
+?ELS19:        EQUAL?  PRSA,V?POUR \FALSE
+       EQUAL?  PRSO,BLORT-POTION \FALSE
+       CALL    POTION-POUR,BLORT-VIAL
+       RSTACK  
+
+
+       .FUNCT  I-UNBLORT
+       SET     'BLORTED,FALSE-VALUE
+       EQUAL?  UNDER-INFLUENCE,BLORT-POTION \?CND1
+       SET     'UNDER-INFLUENCE,FALSE-VALUE
+?CND1: CRLF    
+       PRINTI  "Your eyes tingle for a moment."
+       ZERO?   LIT \?CND6
+       PRINTI  " You can no longer see anything around you!"
+?CND6: CRLF    
+       RTRUE   
+
+
+       .FUNCT  I-UNFWEEP
+       SET     'FWEEPED,FALSE-VALUE
+       SET     'FLYING,FALSE-VALUE
+       CRLF    
+       PRINTI  "After a moment of futilely flapping your arms, you realize that the fweep spell has worn off. "
+       EQUAL?  HERE,GLASS-MAZE \?ELS5
+       CALL    NO-FLOOR?
+       ZERO?   STACK /?ELS5
+       CALL    JIGS-UP,STR?216
+       JUMP    ?CND3
+?ELS5: EQUAL?  HERE,TREE-BRANCH \?ELS9
+       CALL    SETTLE-ONTO-BRANCH
+       JUMP    ?CND3
+?ELS9: EQUAL?  HERE,LAGOON \?ELS11
+       CALL    SPLASH-INTO-WATER
+       JUMP    ?CND3
+?ELS11:        PRINTI  "You fall several feet to the ground."
+       CRLF    
+?CND3: GRTR?   AWAKE,8 \FALSE
+       CALL    I-TIRED
+       RSTACK  
+
+
+       .FUNCT  DRAWBRIDGE-F,RARG
+       EQUAL?  RARG,M-END \?ELS5
+       ZERO?   FLYING \?ELS5
+       ZERO?   DRAWBRIDGE-MOVE /?ELS12
+       RANDOM  100
+       LESS?   40,STACK /?ELS18
+       PRINTI  "With a scream of splintering wood, part of the drawbridge collapses and spills you into the moat. "
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS18:        PRINTR  "The bridge continues to creak."
+?ELS12:        SET     'DRAWBRIDGE-MOVE,TRUE-VALUE
+       RFALSE  
+?ELS5: EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "You are "
+       ZERO?   FLYING /?ELS33
+       PRINTI  "floating over"
+       JUMP    ?CND31
+?ELS33:        PRINTI  "standing on"
+?CND31:        PRINTI  " the drawbridge of a ruined castle which lies to your east. The wood of the bridge looks severely rotted"
+       ZERO?   FLYING /?ELS45
+       PRINTI  ". The moat is"
+       JUMP    ?CND43
+?ELS45:        PRINTI  " and creaks ominously beneath you. The moat, although an easy dive from here, looks dangerous,"
+?CND43:        PRINTR  " full of sinister shapes beneath the surface of the water. To the west is a wide field."
+
+
+       .FUNCT  DRAWBRIDGE-EXIT-F
+       CALL    JIGS-UP,STR?217
+       RFALSE  
+
+
+       .FUNCT  MOAT-F
+       EQUAL?  PRSA,V?PULVER \?ELS5
+       PRINTR  "The moat dries up, leaving vicious-looking creatures flopping around in puddles. Immediately, the castle's automatic moat-filler turns on, and refills the moat."
+?ELS5: EQUAL?  PRSA,V?DRINK-FROM,V?DRINK \?ELS9
+       CALL    PERFORM,V?DRINK,WATER
+       RTRUE   
+?ELS9: EQUAL?  PRSA,V?EXAMINE \?ELS11
+       PRINTR  "The water is murky, and lily pads cover most of the surface. Dark shapes swim about below the surface."
+?ELS11:        EQUAL?  PRSA,V?THROUGH,V?LEAP \FALSE
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+
+
+       .FUNCT  BRIDGE-F
+       EQUAL?  PRSA,V?LOOK-UNDER \?ELS5
+       CALL    PERFORM,V?EXAMINE,MOAT
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?LISTEN \FALSE
+       PRINTR  "Creak, creak."
+
+
+       .FUNCT  TURRET-PSEUDO
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       EQUAL?  HERE,RUINS \?ELS10
+       CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS10:        EQUAL?  HERE,MEADOW \?ELS12
+       CALL    CANT-ENTER,IT
+       RSTACK  
+?ELS12:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?EXIT,V?DROP \?ELS16
+       EQUAL?  HERE,TURRET \?ELS21
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS21:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS16:        EQUAL?  PRSA,V?LEAP \FALSE
+       EQUAL?  HERE,TURRET \FALSE
+       SET     'PRSO,FALSE-VALUE
+       CALL    PERFORM,V?LEAP
+       RTRUE   
+
+
+       .FUNCT  TORTURE-DEVICES-F
+       EQUAL?  PRSA,V?EXAMINE \FALSE
+       PRINTR  "All the usual torture devices are here, all quite mean and deadly looking."
+
+
+       .FUNCT  FLAXO-VIAL-F
+       EQUAL?  PRSA,V?READ \FALSE
+       CALL    FIXED-FONT-ON
+       PRINTI  "
+   ""FLAXO POTION
+(exquisite torture)"""
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  FLAXO-POTION-F
+       EQUAL?  PRSA,V?DRINK,V?EAT \?ELS5
+       CALL    HELD?,FLAXO-VIAL
+       ZERO?   STACK \?ELS5
+       CALL    POTION-POUR,FLAXO-VIAL
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?RESEARCH \?ELS9
+       CALL    READ-ABOUT-POTIONS,2
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?DRINK,V?EAT \?ELS11
+       MOVE    FLAXO-POTION,DIAL
+       PRINTI  "The potion tastes like a combination of anchovies, prune juice, and garlic powder. As you finish swallowing the potion, a well-muscled troll saunters in"
+       EQUAL?  HERE,TORTURE-CHAMBER \?CND14
+       PRINTI  " and straps you to a torture device"
+?CND14:        PRINTR  ". He whacks your head with a wooden two-by-four, grunting ""You are playing Sorcerer. It was written by S. Eric Meretzky. You will have fun and enjoy yourself."" He repeats this action 999 more times, then vanishes without a trace."
+?ELS11:        EQUAL?  PRSA,V?DROP \?ELS22
+       CALL    PERFORM,V?POUR,PRSO,PRSI
+       RTRUE   
+?ELS22:        EQUAL?  PRSA,V?POUR \FALSE
+       EQUAL?  PRSO,FLAXO-POTION \FALSE
+       CALL    POTION-POUR,FLAXO-VIAL
+       RSTACK  
+
+
+       .FUNCT  PIT-OF-BONES-EXIT-F
+       ZERO?   FLYING /?ELS3
+       PRINTI  "You can't fly high enough to reach the hole."
+       CRLF    
+       RFALSE  
+?ELS3: PRINTI  "The hole is too high to reach."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  BONES-PSEUDO
+       EQUAL?  PRSA,V?DIG,V?SEARCH,V?TAKE \?ELS5
+       PRINTR  "They're at the bottom of the pit."
+?ELS5: EQUAL?  PRSA,V?MALYON \FALSE
+       CALL    JIGS-UP,STR?225
+       RSTACK  
+
+
+       .FUNCT  PIT-PSEUDO
+       EQUAL?  PRSA,V?THROUGH,V?LEAP \?ELS5
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?LOOK-INSIDE \FALSE
+       PRINTR  "Bones. Lots of bones."
+
+
+       .FUNCT  TOLL-GATE-CROSSING-F
+       FSET?   GATE,OPENBIT \?ELS5
+       RETURN  OUTSIDE-STORE
+?ELS5: ZERO?   FLYING /?ELS7
+       CALL    PERFORM,V?CLIMB-OVER,GATE
+       RFALSE  
+?ELS7: PRINTI  "A sturdy toll gate blocks the highway."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  GATE-F
+       EQUAL?  PRSA,V?CLOSE,V?OPEN \?ELS5
+       CALL    OPEN-CLOSE
+       ZERO?   STACK \TRUE
+       PRINTR  "Only the gnome can do that."
+?ELS5: EQUAL?  PRSA,V?REZROV \?ELS16
+       FSET?   GATE,OPENBIT /FALSE
+       ZERO?   GNOME-SLEEPING /?ELS23
+       SET     'GNOME-SLEEPING,FALSE-VALUE
+       CALL    QUEUE,I-GNOME,2
+       PUT     STACK,0,1
+       PRINTR  "The gate flies open, waking the gnome, who leaps up and slams it closed again. ""Hey! This is a toll gate! Nobody gets through here without paying the one zorkmid toll. Not nobody, not no how."""
+?ELS23:        SET     'GNOME-SLEEPING,TRUE-VALUE
+       CALL    JIGS-UP,STR?228
+       RSTACK  
+?ELS16:        EQUAL?  PRSA,V?CLIMB-FOO,V?CLIMB-OVER \FALSE
+       PRINTR  "The gate extends to the roof of the tunnel, and there are pointed nasties all over it."
+
+
+       .FUNCT  BOOTH-F
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       FSET?   GATE,OPENBIT \?ELS10
+       CALL    JIGS-UP,STR?229
+       RSTACK  
+?ELS10:        PRINTR  "The booth is on the other side of the toll gate."
+?ELS5: EQUAL?  PRSA,V?LOOK-INSIDE \FALSE
+       FSET?   GATE,OPENBIT \?ELS21
+       PRINTR  "It's dark inside the toll booth."
+?ELS21:        CALL    PERFORM,V?THROUGH,BOOTH
+       RTRUE   
+
+
+       .FUNCT  GNOME-DESCFCN,RARG
+       ZERO?   GNOME-SLEEPING /?ELS5
+       PRINTR  "A fat old gnome with a long white beard is sleeping soundly just outside the toll booth. His loud snores echo around the caverns."
+?ELS5: PRINTR  "A chubby gnome stands behind the toll gate, grinning broadly."
+
+
+       .FUNCT  GNOME-F
+       EQUAL?  GNOME,WINNER \?ELS5
+       ZERO?   GNOME-SLEEPING /?ELS10
+       CALL    POOR-LISTENERS
+       CALL    STOP
+       RSTACK  
+?ELS10:        EQUAL?  PRSA,V?OPEN \?ELS13
+       EQUAL?  PRSO,GATE \?ELS13
+       PRINTR  """You'll have to pay the toll first,"" explains the gnome cheerfully, ""and the toll is one zorkmid."""
+?ELS13:        PRINTI  """Conversing with customers is disallowed by union rules."""
+       CRLF    
+       CALL    STOP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?KICK,V?SHAKE \?ELS23
+       ZERO?   GNOME-SLEEPING /?ELS23
+       CALL    PERFORM,V?ALARM,GNOME
+       RTRUE   
+?ELS23:        EQUAL?  PRSA,V?LISTEN \?ELS27
+       ZERO?   GNOME-SLEEPING /?ELS27
+       PRINTR  "The gnome snores loudly."
+?ELS27:        EQUAL?  PRSA,V?ALARM \?ELS33
+       ZERO?   GNOME-SLEEPING \?ELS38
+       PRINTR  "He's awake!"
+?ELS38:        FSET?   GATE,OPENBIT \?ELS42
+       PRINTR  "The gnome opens one eye and looks at you. ""You again! Just go through. Let me sleep."" He begins snoring again."
+?ELS42:        ZERO?   GNOME-ANNOYED /?ELS46
+       CALL    JIGS-UP,STR?230
+       RSTACK  
+?ELS46:        SET     'GNOME-SLEEPING,FALSE-VALUE
+       CALL    QUEUE,I-GNOME,2
+       PUT     STACK,0,1
+       PRINTR  "The gnome stirs a bit and opens one eye, which wanders around until it notices you. He jumps to his feet. ""One zorkmid, please,"" he yells with a smile."
+?ELS33:        EQUAL?  PRSA,V?ASK-FOR,V?ASK-ABOUT,V?GIVE \?ELS53
+       ZERO?   GNOME-SLEEPING /?ELS53
+       PRINTR  "The gnome is asleep, remember?"
+?ELS53:        FSET?   GATE,OPENBIT \?ELS59
+       EQUAL?  PRSA,V?REACH-IN,V?LOOK-INSIDE,V?SEARCH /?THN62
+       EQUAL?  PRSA,V?PICK \?ELS59
+?THN62:        ZERO?   COIN-STOLEN \?ELS59
+       ZERO?   FWEEPED \?ELS59
+       SET     'COIN-STOLEN,TRUE-VALUE
+       MOVE    ZORKMID,PROTAGONIST
+       PRINTR  "You carefully search the sleeping gnome, and take the zorkmid coin you find in his pocket!"
+?ELS59:        EQUAL?  PRSA,V?GIVE \?ELS67
+       EQUAL?  PRSO,ZORKMID \?ELS67
+       FSET?   ZORKMID,ONBIT \?CND70
+       CALL    GNOME-REFUSES
+       RTRUE   
+?CND70:        FSET    GATE,OPENBIT
+       SET     'GNOME-SLEEPING,TRUE-VALUE
+       MOVE    ZORKMID,DIAL
+       CALL    INT,I-GNOME
+       PUT     STACK,0,0
+       ADD     SCORE,20 >SCORE
+       PRINTR  "The gnome pockets the coin and opens the gate. Before you can take a step the gnome falls asleep again."
+?ELS67:        EQUAL?  PRSA,V?YOMIN \FALSE
+       ZERO?   GNOME-SLEEPING /?ELS81
+       PRINTR  "The thoughts of the sleeping gnome are focused on certain activities involving female gnomes. Embarrassed, you withdraw."
+?ELS81:        PRINTR  "The thoughts of the gnome seem evenly divided between getting money from you and getting back to sleep."
+
+
+       .FUNCT  GNOME-REFUSES
+       PRINTR  "The gnome refuses, saying ""That coin is giving off light, and is therefore not legal tender."""
+
+
+       .FUNCT  I-GNOME
+       CALL    QUEUE,I-GNOME,-1
+       PUT     STACK,0,1
+       EQUAL?  HERE,TOLL-GATE \?ELS5
+       INC     'PATIENCE-COUNTER
+       EQUAL?  PATIENCE-COUNTER,5 \?ELS10
+       SET     'GNOME-SLEEPING,TRUE-VALUE
+       CALL    INT,I-GNOME
+       PUT     STACK,0,0
+       SET     'GNOME-ANNOYED,TRUE-VALUE
+       CRLF    
+       PRINTR  """Thanks for nothing, chum,"" growls the gnome as he resumes his nap."
+?ELS10:        CRLF    
+       PRINTR  """Well?"" asks the gnome, tapping impatiently. ""You've interrupted my nap. Are you going to pay the toll, or not?"""
+?ELS5: SET     'GNOME-SLEEPING,TRUE-VALUE
+       SET     'PATIENCE-COUNTER,3
+       CALL    INT,I-GNOME
+       PUT     STACK,0,0
+       RFALSE  
+
+
+       .FUNCT  SIGN-PSEUDO
+       EQUAL?  PRSA,V?READ \FALSE
+       CALL    FIXED-FONT-ON
+       PRINTI  "
+""ZEKE'S APPLIANCE STORE
+
+ Official outlet for all
+Frobozz Magic Appliances"""
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  STORE-PSEUDO
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       EQUAL?  HERE,STORE \?ELS10
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS10:        CALL    DO-WALK,P?SOUTH
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?DROP,V?EXIT \?ELS14
+       EQUAL?  HERE,STORE \?ELS19
+       CALL    DO-WALK,P?NORTH
+       RSTACK  
+?ELS19:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS14:        EQUAL?  PRSA,V?LOOK-INSIDE \FALSE
+       EQUAL?  HERE,STORE \?ELS28
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS28:        CALL    MAKE-OUT
+       RSTACK  
+
+
+       .FUNCT  WAXER-F
+       EQUAL?  PRSA,V?LAMP-ON \?ELS5
+       CALL    HELD?,WAXER
+       ZERO?   STACK /?ELS10
+       PRINTR  "Better put it down, first."
+?ELS10:        ZERO?   FWEEPED /?ELS14
+       CALL    BATTY
+       RSTACK  
+?ELS14:        EQUAL?  HERE,LAGOON,LAGOON-FLOOR \?ELS17
+       CALL    JIGS-UP,STR?233
+       RSTACK  
+?ELS17:        EQUAL?  HERE,MINE-FIELD \?ELS19
+       SET     'FLYING,FALSE-VALUE
+       MOVE    WAXER,DIAL
+       CALL    DO-WALK,P?NORTH
+       RSTACK  
+?ELS19:        PRINTI  "The waxer whirrs about the "
+       LOC     PROTAGONIST
+       FSET?   STACK,VEHBIT \?ELS26
+       PRINTI  "vehicle"
+       JUMP    ?CND24
+?ELS26:        PRINTI  "room"
+?CND24:        PRINTR  " for a minute, polishing the floor."
+?ELS5: EQUAL?  PRSA,V?LAMP-OFF \FALSE
+       PRINTR  "It is."
+
+
+       .FUNCT  CRATER-F,RARG
+       EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "You are "
+       ZERO?   FLYING /?ELS10
+       PRINTI  "floating near"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "standing in"
+?CND8: PRINTR  " the center of an enormous crater, strewn with debris. Several points around the perimeter look climbable."
+
+
+       .FUNCT  CRATER-OUT-F
+       CALL    V-WALK-AROUND
+       RFALSE  
+
+
+       .FUNCT  CRATER-EXIT-F
+       ZERO?   FLYING /?ELS5
+       PRINTI  "As you try to fly over the rim here, a heavy gust of wind blows you back."
+       CRLF    
+       RFALSE  
+?ELS5: PRINTI  "You attempt to climb the rim here, but the rubble is loose and you slide back down."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  CRATER-PSEUDO
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       EQUAL?  HERE,CRATER \?ELS10
+       PRINTR  "Where do you think you are?"
+?ELS10:        EQUAL?  HERE,EDGE-OF-CRATER \?ELS14
+       CALL    DO-WALK,P?SW
+       RSTACK  
+?ELS14:        EQUAL?  HERE,EDGE-OF-CHASM \?ELS16
+       CALL    DO-WALK,P?EAST
+       RSTACK  
+?ELS16:        EQUAL?  HERE,SLIMY-ROOM \?ELS18
+       CALL    DO-WALK,P?SOUTH
+       RSTACK  
+?ELS18:        CALL    DO-WALK,P?NORTH
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?CLIMB-FOO \?ELS22
+       CALL    V-WALK-AROUND
+       RSTACK  
+?ELS22:        EQUAL?  PRSA,V?DISEMBARK,V?EXIT,V?LEAVE \FALSE
+       EQUAL?  HERE,CRATER \?ELS29
+       CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS29:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+
+
+       .FUNCT  CHASM-EXIT-F
+       ZERO?   FLYING /?ELS5
+       PRINTI  "You fly easily across the chasm..."
+       CRLF    
+       CRLF    
+       EQUAL?  HERE,BARE-PASSAGE \?ELS13
+       RETURN  EDGE-OF-CHASM
+?ELS13:        RETURN  BARE-PASSAGE
+?ELS5: PRINTI  "If you really want to jump across the chasm, just say so."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  CHASM-PSEUDO
+       EQUAL?  PRSA,V?LEAP \FALSE
+       RANDOM  100
+       LESS?   75,STACK /?ELS10
+       CALL    JIGS-UP,STR?238
+       RSTACK  
+?ELS10:        EQUAL?  HERE,EDGE-OF-CHASM \?ELS17
+       CALL    GOTO,BARE-PASSAGE
+       RSTACK  
+?ELS17:        CALL    GOTO,EDGE-OF-CHASM
+       RSTACK  
+
+
+       .FUNCT  TREE-ROOM-F,RARG
+       EQUAL?  RARG,M-ENTER \FALSE
+       PUT     VEZZAS,3,0
+       RFALSE  
+
+
+       .FUNCT  ZORKMID-TREE-F
+       EQUAL?  PRSA,V?EXAMINE \?ELS5
+       PRINTR  "It is laden with zorkmids, glinting in the light."
+?ELS5: EQUAL?  PRSA,V?REZROV \?ELS9
+       CALL    V-SWANZO
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?CLIMB-UP,V?CLIMB-FOO \FALSE
+       PRINTR  "The branches don't look sturdy enough."
+
+
+       .FUNCT  ZORKMID-F
+       EQUAL?  PRSA,V?PICK \?ELS5
+       FSET?   PRSO,TRYTAKEBIT \?ELS5
+       EQUAL?  ZORKMID,PRSO \?ELS5
+       CALL    PERFORM,V?TAKE,PRSO,PRSI
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?TAKE \?ELS9
+       FSET?   PRSO,TRYTAKEBIT \?ELS9
+       FCLEAR  PRSO,TRYTAKEBIT
+       FCLEAR  PRSO,NDESCBIT
+       MOVE    ZORKMID-TREE,DIAL
+       MOVE    ZORKMID,PROTAGONIST
+       ADD     SCORE,15 >SCORE
+       PRINTR  "As you pluck the first zorkmid, the tree shimmers and vanishes! (I guess it was just an illusion.) You are left holding a solitary zorkmid coin."
+?ELS9: EQUAL?  PRSA,V?EXAMINE,V?COUNT \?ELS15
+       IN?     ZORKMID-TREE,HERE \?ELS15
+       PRINTR  "There are countless coins, hanging from every branch of the tree."
+?ELS15:        EQUAL?  PRSA,V?EXAMINE \?ELS21
+       PRINTR  "The coin pictures a man with an incredibly flat head, wearing a gaudy crown."
+?ELS21:        EQUAL?  PRSA,V?BITE \?ELS25
+       PRINTR  "Yep, it's real."
+?ELS25:        EQUAL?  PRSA,V?RESEARCH \FALSE
+       PRINTI  "An article in the monetary section explains that the zorkmid was the unit of currency of the Great Underground Empire, and is still used in most parts of the kingdom today. A picture of a zorkmid coin is included. "
+       CALL    PERFORM,V?EXAMINE,ZORKMID
+       RTRUE   
+
+
+       .FUNCT  HALL-OF-CARVINGS-F,RARG
+       EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "You have entered a large room whose walls are covered with intricate carvings. "
+       ZERO?   DRAGON-MOVED /?ELS10
+       PRINTI  "A passage has been recently opened to the south, and is only partially blocked by a huge stone dragon, poised in the midst of an attack."
+       JUMP    ?CND8
+?ELS10:        PRINTI  "The largest and most striking carving, on the southern wall, is of a huge sleeping dragon!"
+?CND8: PRINTR  " A winding tunnel leads north."
+
+
+       .FUNCT  DRAGON-F
+       EQUAL?  PRSA,V?MALYON \FALSE
+       ZERO?   MALYON-YONKED /?ELS10
+       ZERO?   DRAGON-MOVED /?ELS16
+       CALL    JIGS-UP,STR?243
+       RSTACK  
+?ELS16:        SET     'DRAGON-MOVED,TRUE-VALUE
+       PRINTR  "The dragon is suddenly imbued with life and begins to move. It shakes itself loose from the wall, which crumbles down upon the dragon, revealing a southward passage! The dragon howls with pain and anger. Spotting you, the dragon rears back its head, smoke billowing from its nostrils. Then, just as it seems that you will be barbecued, the dragon reverts to stone!"
+?ELS10:        PRINTR  "The dragon seems to shiver for a moment, but that is all."
+
+       .ENDI
index 78c8fc4c4c55f1fca8a67bd4874a1e67cf128add..b76c3a7a02099561d762209fd24ea1fe468a7fb9 100644 (file)
@@ -1253,7 +1253,7 @@ with a smile." CR>)>)
                     ,GNOME-SLEEPING>
                <TELL "The gnome is asleep, remember?" CR>)
               (<AND <FSET? ,GATE ,OPENBIT>
-                    <VERB? SEARCH LOOK-INSIDE PICK>
+                    <VERB? SEARCH LOOK-INSIDE REACH-IN PICK>
                     <NOT ,COIN-STOLEN>
                     <NOT ,FWEEPED>>
                <SETG COIN-STOLEN T>
diff --git a/coal.zap b/coal.zap
new file mode 100644 (file)
index 0000000..3ec05ba
--- /dev/null
+++ b/coal.zap
@@ -0,0 +1,928 @@
+
+
+       .FUNCT  COAL-F
+       EQUAL?  PRSA,V?TAKE \FALSE
+       PRINTR  "Such menial tasks are best left to troglodytes."
+
+
+       .FUNCT  SOOTY-ROOM-F,RARG
+       EQUAL?  RARG,M-ENTER \FALSE
+       FSET?   SOOTY-ROOM,TOUCHBIT /FALSE
+       ADD     SCORE,20 >SCORE
+       RETURN  SCORE
+
+
+       .FUNCT  SOOTY-ROOM-EXIT-F
+       FSET?   COAL-BIN-ROOM,TOUCHBIT \?ELS5
+       PRINTI  "That passage is now completely blocked by a cave-in."
+       CRLF    
+       RFALSE  
+?ELS5: RETURN  COAL-BIN-ROOM
+
+
+       .FUNCT  TIMBER-PSEUDO
+       EQUAL?  PRSA,V?MOVE \FALSE
+       CALL    JIGS-UP,STR?299
+       RSTACK  
+
+
+       .FUNCT  COAL-BIN-ROOM-F,RARG
+       EQUAL?  RARG,M-ENTER \?ELS5
+       FSET?   HERE,TOUCHBIT /?ELS10
+       RANDOM  873 >COMBO
+       PUT     VEZZAS,5,0
+       PRINTI  "There is a rumbling noise behind you as the ceiling of the tunnel collapses, blocking your retreat! The air smells strongly of coal gas. "
+       ZERO?   VILSTUED /?ELS15
+       CALL    QUEUE,I-OLDER-SELF,2
+       PUT     STACK,0,1
+       PRINTI  "Good thing you took that vilstu potion"
+       JUMP    ?CND13
+?ELS15:        CALL    QUEUE,I-SUFFOCATE,2
+       PUT     STACK,0,1
+       PRINTI  "You won't survive long in this atmosphere"
+?CND13:        PRINTI  "."
+       CRLF    
+       CRLF    
+       RTRUE   
+?ELS10:        ZERO?   GOLMACKED /FALSE
+       CALL    QUEUE,I-YOUNGER-SELF,-1
+       PUT     STACK,0,1
+       MOVE    YOUNGER-SELF,HERE
+       ZERO?   YOUNGER-HAS-SPELL-BOOK /?CND28
+       IN?     SPELL-BOOK,LAGOON-FLOOR \?CND32
+       SET     'BOOK-BELONGS-IN-LAGOON,TRUE-VALUE
+?CND32:        MOVE    SPELL-BOOK,YOUNGER-SELF
+       FSET    SPELL-BOOK,TRYTAKEBIT
+?CND28:        CALL    LIT?,HERE >LIT
+       RETURN  LIT
+?ELS5: EQUAL?  RARG,M-END \FALSE
+       RANDOM  100
+       LESS?   35,STACK /FALSE
+       CRLF    
+       PRINTR  "A few lumps of coal spill from the coal chute."
+
+
+       .FUNCT  I-SUFFOCATE
+       CRLF    
+       ZERO?   SUFFOCATE-WARNING /?ELS5
+       CALL    JIGS-UP,STR?301
+       RSTACK  
+?ELS5: SET     'SUFFOCATE-WARNING,TRUE-VALUE
+       CALL    QUEUE,I-SUFFOCATE,2
+       PUT     STACK,0,1
+       PRINTR  "You are about to pass out from the bad air."
+
+
+       .FUNCT  COAL-BIN-F
+       EQUAL?  PRSA,V?LOOK-INSIDE \?ELS5
+       PRINTR  "It's full of coal."
+?ELS5: EQUAL?  PRSA,V?DIG,V?SEARCH \FALSE
+       PRINTR  "You find nothing of interest."
+
+
+       .FUNCT  UPPER-CHUTE-F
+       EQUAL?  PRSA,V?LEAP,V?THROUGH \?ELS5
+       EQUAL?  HERE,TOP-OF-CHUTE,SLANTED-ROOM \?ELS10
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS10:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?CLIMB-FOO,V?CLIMB-UP \?ELS14
+       EQUAL?  HERE,TOP-OF-CHUTE \?ELS19
+       CALL    BOTTOM-TOP-OF-CHUTE,TRUE-VALUE
+       RSTACK  
+?ELS19:        CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS14:        EQUAL?  PRSA,V?CLIMB-DOWN \?ELS23
+       EQUAL?  HERE,COAL-BIN-ROOM \?ELS28
+       CALL    BOTTOM-TOP-OF-CHUTE
+       RSTACK  
+?ELS28:        CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS23:        EQUAL?  PRSA,V?LOWER-INTO,V?PUT \?ELS32
+       EQUAL?  PRSI,UPPER-CHUTE \?ELS32
+       EQUAL?  HERE,TOP-OF-CHUTE,SLANTED-ROOM \?ELS39
+       EQUAL?  PRSO,BEAM \?ELS44
+       ZERO?   ROPE-TO-BEAM /?ELS44
+       MOVE    ROPE,COAL-BIN-ROOM
+       MOVE    BEAM,COAL-BIN-ROOM
+       SET     'ROPE-PLACED,FALSE-VALUE
+       FCLEAR  BEAM,TRYTAKEBIT
+       FCLEAR  ROPE,TRYTAKEBIT
+       CALL    BEAM-AND-ROPE
+       RSTACK  
+?ELS44:        EQUAL?  PRSO,ROPE \?ELS48
+       ZERO?   ROPE-TO-BEAM /?ELS48
+       CALL    DROP-BEAM-FIRST
+       ZERO?   STACK \TRUE
+       SET     'ROPE-PLACED,TRUE-VALUE
+       FSET    BEAM,TRYTAKEBIT
+       FSET    ROPE,TRYTAKEBIT
+       MOVE    ROPE,HERE
+       CALL    ROPE-HANGS
+       RSTACK  
+?ELS48:        GETP    PRSO,P?SIZE
+       LESS?   STACK,20 \?ELS58
+       MOVE    PRSO,DIAL
+       JUMP    ?CND56
+?ELS58:        MOVE    PRSO,COAL-BIN-ROOM
+?CND56:        CALL    DISAPPEARS-DOWN-CHUTE
+       RSTACK  
+?ELS39:        EQUAL?  HERE,COAL-BIN-ROOM \FALSE
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS32:        EQUAL?  PRSA,V?LOOK-INSIDE \FALSE
+       CALL    PERFORM,V?RESEARCH,UPPER-CHUTE
+       RTRUE   
+
+
+       .FUNCT  LOWER-CHUTE-F
+       EQUAL?  PRSA,V?CLIMB-FOO,V?CLIMB-UP \?ELS5
+       EQUAL?  HERE,COAL-BIN-ROOM \?ELS10
+       CALL    BOTTOM-TOP-OF-CHUTE,TRUE-VALUE
+       RSTACK  
+?ELS10:        CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?LEAP,V?THROUGH,V?CLIMB-DOWN \?ELS14
+       EQUAL?  HERE,COVE \?ELS19
+       CALL    BOTTOM-TOP-OF-CHUTE
+       RSTACK  
+?ELS19:        CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS14:        EQUAL?  PRSA,V?LOWER-INTO,V?PUT \?ELS23
+       EQUAL?  PRSI,LOWER-CHUTE \?ELS23
+       EQUAL?  HERE,COAL-BIN-ROOM \?ELS30
+       EQUAL?  PRSO,BEAM \?ELS35
+       ZERO?   ROPE-TO-BEAM /?ELS35
+       MOVE    ROPE,LAGOON-FLOOR
+       MOVE    BEAM,LAGOON-FLOOR
+       SET     'ROPE-IN-LOWER-CHUTE,FALSE-VALUE
+       FCLEAR  ROPE,TRYTAKEBIT
+       CALL    BEAM-AND-ROPE
+       RSTACK  
+?ELS35:        EQUAL?  PRSO,ROPE \?ELS39
+       ZERO?   ROPE-TO-BEAM /?ELS39
+       CALL    DROP-BEAM-FIRST
+       ZERO?   STACK \TRUE
+       SET     'ROPE-IN-LOWER-CHUTE,TRUE-VALUE
+       FSET    ROPE,TRYTAKEBIT
+       MOVE    ROPE,HERE
+       CALL    ROPE-HANGS
+       RSTACK  
+?ELS39:        MOVE    PRSO,LAGOON-FLOOR
+       FSET?   PRSO,SCROLLBIT /?THN50
+       EQUAL?  PRSO,SPELL-BOOK \?CND47
+?THN50:        FSET    PRSO,MUNGBIT
+?CND47:        CALL    DISAPPEARS-DOWN-CHUTE
+       RSTACK  
+?ELS30:        EQUAL?  HERE,COAL-BIN-ROOM \FALSE
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS23:        EQUAL?  PRSA,V?LOOK-INSIDE \FALSE
+       CALL    PERFORM,V?RESEARCH,LOWER-CHUTE
+       RTRUE   
+
+
+       .FUNCT  DROP-BEAM-FIRST
+       CALL    HELD?,BEAM
+       ZERO?   STACK /FALSE
+       PRINTR  "You'll have to drop the beam before doing that."
+
+
+       .FUNCT  BEAM-AND-ROPE
+       PRINTR  "The beam and rope both slide into the chute."
+
+
+       .FUNCT  ROPE-HANGS
+       PRINTR  "The rope hangs from the beam, into the chute."
+
+
+       .FUNCT  DISAPPEARS-DOWN-CHUTE
+       PRINTI  "The "
+       PRINTD  PRSO
+       PRINTR  " disappears into the chute."
+
+
+       .FUNCT  OLDER-SELF-F
+       EQUAL?  WINNER,OLDER-SELF \?ELS5
+       PRINTI  "Your older self ignores your words."
+       CRLF    
+       CALL    STOP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?EXAMINE \?ELS9
+       PRINT   OLDER-INTRO
+       PRINTR  " The stranger is carrying a smelly scroll."
+?ELS9: EQUAL?  PRSA,V?GIVE \?ELS13
+       EQUAL?  PRSO,SPELL-BOOK \?ELS13
+       MOVE    SPELL-BOOK,OLDER-SELF
+       FSET    SPELL-BOOK,TRYTAKEBIT
+       PRINTR  "Your older self accepts the spell book gratefully."
+?ELS13:        EQUAL?  PRSA,V?FOLLOW \?ELS19
+       ZERO?   TWIN-FOLLOW /?ELS19
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS19:        EQUAL?  PRSA,V?AIMFIZ \?ELS23
+       CALL    V-SWANZO
+       RSTACK  
+?ELS23:        EQUAL?  PRSA,V?YOMIN \FALSE
+       PRINTR  "The thoughts of your older self center on attempting to breathe."
+
+
+       .FUNCT  I-OLDER-SELF
+       CALL    QUEUE,I-OLDER-SELF,-1
+       PUT     STACK,0,1
+       INC     'OLDER-COUNTER
+       EQUAL?  OLDER-COUNTER,1 \?ELS5
+       MOVE    OLDER-SELF,COAL-BIN-ROOM
+       CALL    HELD?,SPELL-BOOK
+       ZERO?   STACK /?CND6
+       SET     'YOUNGER-HAS-SPELL-BOOK,TRUE-VALUE
+?CND6: EQUAL?  HERE,COAL-BIN-ROOM \?ELS13
+       CRLF    
+       PRINTI  "Someone slides out of the coal chute, and lands near the bin. "
+       PRINT   OLDER-INTRO
+       CRLF    
+       SET     'OLDER-INTRODUCED,TRUE-VALUE
+       RETURN  OLDER-INTRODUCED
+?ELS13:        EQUAL?  HERE,DIAL-ROOM \?ELS19
+       CRLF    
+       PRINTR  "You here a commotion from the room to the west."
+?ELS19:        CALL    INT,I-OLDER-SELF
+       PUT     STACK,0,0
+       RFALSE  
+?ELS5: EQUAL?  OLDER-COUNTER,2 \?ELS25
+       CALL    DATA-TO-TABLE,MOVE-ONE-TABLE
+       EQUAL?  HERE,COAL-BIN-ROOM \?ELS30
+       CRLF    
+       ZERO?   OLDER-INTRODUCED \?CND31
+       SET     'OLDER-INTRODUCED,TRUE-VALUE
+       PRINTI  "Someone is standing near the coal bin. "
+       PRINT   OLDER-INTRO
+       CRLF    
+       CRLF    
+?CND31:        SET     'COMBO-DISCOVERED,TRUE-VALUE
+       CALL    OLDER-TELLS-COMBO
+       IN?     SPELL-BOOK,OLDER-SELF /?CND36
+       PRINTI  " Your older self then looks at you, almost expectantly."
+?CND36:        CRLF    
+       RTRUE   
+?ELS30:        CRLF    
+       PRINTR  "From the next room you glimpse someone gasping for air."
+?ELS25:        EQUAL?  OLDER-COUNTER,3 \?ELS46
+       CALL    DATA-TO-TABLE,MOVE-TWO-TABLE
+       EQUAL?  HERE,COAL-BIN-ROOM \?ELS51
+       ZERO?   OLDER-INTRODUCED \?CND52
+       SET     'OLDER-INTRODUCED,TRUE-VALUE
+       CRLF    
+       PRINTI  "Someone is standing near the coal bin. "
+       PRINT   OLDER-INTRO
+       CRLF    
+?CND52:        IN?     SPELL-BOOK,OLDER-SELF \?ELS61
+       MOVE    SPELL-BOOK,YOUNGER-SELF
+       FSET    SPELL-BOOK,TRYTAKEBIT
+       MOVE    OLDER-SELF,DIAL
+       MOVE    VARDIK-SCROLL,DIAL
+       SET     'TWIN-FOLLOW,TRUE-VALUE
+       CALL    QUEUE,I-TWIN-UNFOLLOW,1
+       PUT     STACK,0,1
+       CRLF    
+       PRINTR  "Your look-alike dives into the lower chute and slides out of view."
+?ELS61:        ZERO?   COMBO-DISCOVERED \?ELS65
+       CRLF    
+       CALL    OLDER-TELLS-COMBO
+       CRLF    
+       RTRUE   
+?ELS65:        CRLF    
+       PRINTR  """Give me...the spell book,"" croaks your older self."
+?ELS51:        MOVE    OLDER-SELF,DIAL
+       MOVE    VARDIK-SCROLL,DIAL
+       CRLF    
+       PRINTR  "Someone in the coal bin room dives into the lower chute."
+?ELS46:        CALL    DATA-TO-TABLE,MOVE-THREE-TABLE
+       CALL    INT,I-OLDER-SELF
+       PUT     STACK,0,0
+       EQUAL?  HERE,COAL-BIN-ROOM \?CND76
+       IN?     OLDER-SELF,HERE \?CND76
+       CRLF    
+       PRINTI  "Your older self dives into the lower chute."
+       CRLF    
+?CND76:        MOVE    OLDER-SELF,DIAL
+       MOVE    VARDIK-SCROLL,DIAL
+       RTRUE   
+
+
+       .FUNCT  OLDER-TELLS-COMBO
+       PRINTI  "Your disheveled ""twin"" is having difficulty breathing, but gasps, ""The combination is "
+       PRINTN  COMBO
+       PRINTI  "."""
+       RTRUE   
+
+
+       .FUNCT  I-TWIN-UNFOLLOW
+       SET     'TWIN-FOLLOW,FALSE-VALUE
+       RFALSE  
+
+
+       .FUNCT  DATA-TO-TABLE,TABLE
+       PUT     TABLE,1,PRSA
+       PUT     TABLE,2,PRSO
+       PUT     TABLE,3,PRSI
+       RTRUE   
+
+
+       .FUNCT  YOUNGER-SELF-F
+       EQUAL?  YOUNGER-SELF,WINNER \?ELS5
+       EQUAL?  PRSA,V?COMBO \?ELS10
+       EQUAL?  PRSO,INTNUM \?ELS10
+       EQUAL?  P-NUMBER,COMBO \?CND13
+       SET     'COMBO-REVEALED,TRUE-VALUE
+?CND13:        PRINTR  "Your younger self seems surprised by your statement."
+?ELS10:        EQUAL?  PRSA,V?GIVE \?ELS19
+       EQUAL?  PRSO,SPELL-BOOK \?ELS19
+       EQUAL?  PRSI,ME \?ELS19
+       CALL    SPELL-BOOK-PASS-OFF-CHECK
+       ZERO?   STACK \TRUE
+?ELS19:        PRINTI  "Your younger self seems confused, and doesn't respond."
+       CRLF    
+       CALL    STOP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?YOMIN \?ELS27
+       PRINTR  "The thoughts of your younger self are confused, and seem to center on whether or not to perform a SAVE."
+?ELS27:        EQUAL?  PRSA,V?AIMFIZ \?ELS31
+       CALL    V-SWANZO
+       RSTACK  
+?ELS31:        EQUAL?  PRSA,V?EXAMINE \FALSE
+       PRINTI  "It's almost like looking in a mirror. Your younger self looks confused"
+       IN?     SPELL-BOOK,YOUNGER-SELF \?CND36
+       PRINTI  ", and is carrying a spell book"
+?CND36:        PRINTR  "."
+
+
+       .FUNCT  YOUNGER-SELF-DESCFCN,TABLE
+       LESS?   YOUNGER-COUNTER,3 \?ELS3
+       SET     'TABLE,MOVE-ONE-TABLE
+       JUMP    ?CND1
+?ELS3: EQUAL?  YOUNGER-COUNTER,3 \?ELS5
+       SET     'TABLE,MOVE-TWO-TABLE
+       JUMP    ?CND1
+?ELS5: SET     'TABLE,MOVE-THREE-TABLE
+?CND1: FSET?   YOUNGER-SELF,TOUCHBIT \?ELS12
+       PRINTI  "Your younger self is here"
+       ZERO?   YOUNGER-HAS-SPELL-BOOK /?ELS19
+       PRINTR  ", holding your spell book."
+?ELS19:        PRINTR  "."
+?ELS12:        FSET    YOUNGER-SELF,TOUCHBIT
+       PRINTI  "Standing here, looking quite confused, is someone who could only be your younger self -- an exact duplicate of you, but cleaner and breathing with considerably less difficulty. You remember seeing this scene from another viewpoint just a short while ago."
+       ZERO?   YOUNGER-HAS-SPELL-BOOK /?CND31
+       PRINTI  " Among the items carried by your ""twin"" is your spell book."
+?CND31:        CRLF    
+       RTRUE   
+
+
+       .FUNCT  SPELL-BOOK-PASS-OFF-CHECK,TABLE
+       EQUAL?  YOUNGER-COUNTER,1 \?ELS3
+       SET     'TABLE,MOVE-ONE-TABLE
+       JUMP    ?CND1
+?ELS3: EQUAL?  YOUNGER-COUNTER,2 \?ELS5
+       SET     'TABLE,MOVE-TWO-TABLE
+       JUMP    ?CND1
+?ELS5: EQUAL?  YOUNGER-COUNTER,3 \FALSE
+       SET     'TABLE,MOVE-THREE-TABLE
+?CND1: GET     TABLE,2
+       EQUAL?  STACK,SPELL-BOOK \?ELS18
+       GET     TABLE,3
+       EQUAL?  STACK,OLDER-SELF \?ELS18
+       GET     TABLE,1
+       EQUAL?  STACK,V?GIVE /TRUE
+?ELS18:        GET     TABLE,2
+       EQUAL?  STACK,OLDER-SELF \FALSE
+       GET     TABLE,3
+       EQUAL?  STACK,SPELL-BOOK \FALSE
+       GET     TABLE,1
+       EQUAL?  STACK,V?SGIVE \FALSE
+       RTRUE   
+
+
+       .FUNCT  I-YOUNGER-SELF
+       INC     'YOUNGER-COUNTER
+       IN?     YOUNGER-SELF,HERE \FALSE
+       ZERO?   LIT \?ELS7
+       ZERO?   BLORTED /FALSE
+?ELS7: EQUAL?  YOUNGER-COUNTER,2 \?ELS11
+       CALL    YOUNGER-ACTIONS,MOVE-ONE-TABLE
+       RSTACK  
+?ELS11:        EQUAL?  YOUNGER-COUNTER,3 \?ELS13
+       CALL    YOUNGER-ACTIONS,MOVE-TWO-TABLE
+       RSTACK  
+?ELS13:        EQUAL?  YOUNGER-COUNTER,4 \FALSE
+       CALL    YOUNGER-ACTIONS,MOVE-THREE-TABLE
+       RSTACK  
+
+
+       .FUNCT  YOUNGER-ACTIONS,TABLE
+       GET     TABLE,2
+       ZERO?   STACK \?CND1
+       PUT     TABLE,2,NOT-HERE-OBJECT
+?CND1: GET     TABLE,3
+       ZERO?   STACK \?CND4
+       PUT     TABLE,3,NOT-HERE-OBJECT
+?CND4: GET     TABLE,2
+       EQUAL?  STACK,OLDER-SELF \?ELS9
+       PUT     TABLE,2,YOU-OBJECT
+       JUMP    ?CND7
+?ELS9: GET     TABLE,2
+       EQUAL?  STACK,ME \?CND7
+       PUT     TABLE,2,YOUNGER-SELF
+?CND7: GET     TABLE,3
+       EQUAL?  STACK,OLDER-SELF \?ELS14
+       PUT     TABLE,3,YOU-OBJECT
+       JUMP    ?CND12
+?ELS14:        GET     TABLE,3
+       EQUAL?  STACK,ME \?CND12
+       PUT     TABLE,3,YOUNGER-SELF
+?CND12:        CRLF    
+       PRINTI  "Your younger self "
+       GET     TABLE,2
+       EQUAL?  STACK,SPELL-BOOK \?ELS27
+       GET     TABLE,3
+       EQUAL?  STACK,YOU-OBJECT \?ELS27
+       GET     TABLE,1
+       EQUAL?  STACK,V?GIVE /?THN24
+?ELS27:        GET     TABLE,2
+       EQUAL?  STACK,YOU-OBJECT \?ELS23
+       GET     TABLE,3
+       EQUAL?  STACK,SPELL-BOOK \?ELS23
+       GET     TABLE,1
+       EQUAL?  STACK,V?SGIVE \?ELS23
+?THN24:        MOVE    SPELL-BOOK,PROTAGONIST
+       FCLEAR  SPELL-BOOK,TRYTAKEBIT
+       PRINTR  "hands you your spell book!"
+?ELS23:        GET     TABLE,1
+       EQUAL?  STACK,V?VERBOSE,V?BRIEF,V?SUPER-BRIEF /?THN34
+       GET     TABLE,1
+       EQUAL?  STACK,V?SCORE,V?SCRIPT,V?UNSCRIPT \?ELS33
+?THN34:        PRINTR  "is performing a spell of high technology."
+?ELS33:        GET     TABLE,1
+       EQUAL?  STACK,V?ANSWER,V?REPLY,V?CURSE /?THN40
+       GET     TABLE,1
+       EQUAL?  STACK,V?HELLO,V?TELL,V?ASK-FOR /?THN40
+       GET     TABLE,1
+       EQUAL?  STACK,V?SAY,V?THANK,V?YELL /?THN40
+       GET     TABLE,1
+       EQUAL?  STACK,V?ASK-ABOUT \?ELS39
+?THN40:        PRINTR  "is attempting to talk."
+?ELS39:        GET     TABLE,1
+       EQUAL?  STACK,V?CAST,V?GNUSTO,V?FROTZ /?THN46
+       GET     TABLE,1
+       EQUAL?  STACK,V?REZROV,V?IZYUK,V?FWEEP /?THN46
+       GET     TABLE,1
+       EQUAL?  STACK,V?AIMFIZ,V?SWANZO,V?VARDIK /?THN46
+       GET     TABLE,1
+       EQUAL?  STACK,V?MEEF,V?PULVER,V?GOLMAC /?THN46
+       GET     TABLE,1
+       EQUAL?  STACK,V?YOMIN,V?VEZZA,V?GASPAR /?THN46
+       GET     TABLE,1
+       EQUAL?  STACK,V?YONK,V?MALYON \?ELS45
+?THN46:        PRINTR  "is casting a familiar spell."
+?ELS45:        GET     TABLE,1
+       EQUAL?  STACK,V?INVENTORY \?ELS51
+       PRINTR  "is doing an inventory."
+?ELS51:        GET     TABLE,1
+       EQUAL?  STACK,V?DIAGNOSE \?ELS55
+       PRINTR  "is checking for wounds."
+?ELS55:        GET     TABLE,1
+       EQUAL?  STACK,V?WAIT \?ELS59
+       PRINTR  "is doing absolutely nothing."
+?ELS59:        GET     TABLE,1
+       EQUAL?  STACK,V?SLEEP \?ELS63
+       PRINTR  "is trying to fall asleep!"
+?ELS63:        GET     TABLE,1
+       EQUAL?  STACK,V?LEARN \?ELS67
+       PRINTR  "is studying a spell book."
+?ELS67:        GET     TABLE,1
+       EQUAL?  STACK,V?SPELLS \?ELS71
+       PRINTR  "seems lost in thought."
+?ELS71:        GET     TABLE,1
+       EQUAL?  STACK,V?LOOK \?ELS75
+       PRINTR  "is looking around."
+?ELS75:        GET     TABLE,1
+       EQUAL?  STACK,V?LEAP,V?SKIP \?ELS79
+       PRINTR  "is hopping around like a crazed rabbit."
+?ELS79:        GET     TABLE,1
+       EQUAL?  STACK,V?WALK,V?WALK-AROUND,V?WALK-TO \?ELS83
+       PRINTR  "is moving around."
+?ELS83:        GET     TABLE,1
+       EQUAL?  STACK,V?GIVE \?ELS87
+       PRINTI  "is trying to give"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTI  " to"
+       GET     TABLE,3
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS87:        GET     TABLE,1
+       EQUAL?  STACK,V?SHOW \?ELS95
+       PRINTI  "is trying to show"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTI  " to"
+       GET     TABLE,3
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS95:        GET     TABLE,1
+       EQUAL?  STACK,V?RAISE,V?LOWER,V?RUB /?THN104
+       GET     TABLE,1
+       EQUAL?  STACK,V?MOVE,V?SHAKE,V?PUSH /?THN104
+       GET     TABLE,1
+       EQUAL?  STACK,V?KICK,V?PUT-ON,V?PUSH-TO /?THN104
+       GET     TABLE,1
+       EQUAL?  STACK,V?PUT,V?PUT-UNDER,V?PUT-BEHIND \?ELS103
+?THN104:       GET     TABLE,1
+       EQUAL?  STACK,V?PUT \?CND106
+       GET     TABLE,2
+       EQUAL?  STACK,SPELL-BOOK \?CND106
+       GET     TABLE,3
+       EQUAL?  STACK,LOWER-CHUTE \?CND106
+       MOVE    SPELL-BOOK,DIAL
+?CND106:       PRINTI  "is attempting to move"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS103:       GET     TABLE,1
+       EQUAL?  STACK,V?EXAMINE,V?LOOK-INSIDE /?THN117
+       GET     TABLE,1
+       EQUAL?  STACK,V?LOOK-BEHIND,V?LOOK-UNDER \?ELS116
+?THN117:       PRINTI  "is examining"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS116:       GET     TABLE,1
+       EQUAL?  STACK,V?BOARD,V?ENTER,V?THROUGH \?ELS124
+       PRINTI  "is trying to get into"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS124:       GET     TABLE,1
+       EQUAL?  STACK,V?THROW,V?THROW-OFF \?ELS130
+       PRINTI  "is performing aeronautical experiments with"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS130:       GET     TABLE,1
+       EQUAL?  STACK,V?WHAT,V?WHERE,V?WHO \?ELS136
+       PRINTI  "is asking about"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  ", addressing the question to no one in particular."
+?ELS136:       GET     TABLE,1
+       EQUAL?  STACK,V?ATTACK,V?KILL,V?MUNG \?ELS142
+       PRINTI  "is attacking"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK,TRUE-VALUE
+       PRINTR  "."
+?ELS142:       GET     TABLE,1
+       EQUAL?  STACK,V?EAT,V?DRINK \?ELS148
+       PRINTI  "is attempting to ingest"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS148:       GET     TABLE,1
+       EQUAL?  STACK,V?CLIMB-ON,V?CLIMB-UP,V?CLIMB-FOO /?THN155
+       GET     TABLE,1
+       EQUAL?  STACK,V?CLIMB-DOWN,V?CLIMB-OVER \?ELS154
+?THN155:       PRINTI  "is climbing"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK,TRUE-VALUE
+       PRINTR  "."
+?ELS154:       GET     TABLE,1
+       EQUAL?  STACK,V?READ \?ELS162
+       PRINTI  "is reading"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS162:       GET     TABLE,1
+       EQUAL?  STACK,V?SMELL \?ELS168
+       PRINTI  "is smelling"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS168:       GET     TABLE,1
+       EQUAL?  STACK,V?LISTEN \?ELS174
+       PRINTI  "seems to be listening to"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS174:       GET     TABLE,1
+       EQUAL?  STACK,V?KISS \?ELS180
+       PRINTI  "tries to kiss"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS180:       GET     TABLE,1
+       EQUAL?  STACK,V?OPEN \?ELS186
+       PRINTI  "is trying to open"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS186:       GET     TABLE,1
+       EQUAL?  STACK,V?CLOSE \?ELS192
+       PRINTI  "is closing"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS192:       GET     TABLE,1
+       EQUAL?  STACK,V?EXIT,V?DISEMBARK \?ELS198
+       PRINTI  "is trying to leave"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS198:       GET     TABLE,1
+       EQUAL?  STACK,V?TAKE \?ELS204
+       PRINTI  "is reaching for"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS204:       GET     TABLE,1
+       EQUAL?  STACK,V?DROP \?ELS210
+       PRINTI  "is dropping"
+       GET     TABLE,2
+       CALL    ARTICLE,STACK
+       PRINTR  "."
+?ELS210:       PRINTR  "is doing something."
+
+
+       .FUNCT  LAMP-PSEUDO
+       EQUAL?  PRSA,V?TAKE \FALSE
+       CALL    PERFORM,V?TAKE,KEROSENE-LAMP
+       RTRUE   
+
+
+       .FUNCT  DIAL-DOOR-F
+       EQUAL?  PRSA,V?OPEN \?ELS5
+       FSET?   DIAL-DOOR,OPENBIT /?ELS5
+       ZERO?   DIAL-OPEN /?ELS12
+       FSET    DIAL-DOOR,OPENBIT
+       ADD     SCORE,COAL-DOOR-POINT >SCORE
+       SET     'COAL-DOOR-POINT,0
+       PRINTR  "The door opens easily."
+?ELS12:        PRINTR  "The door won't budge."
+?ELS5: EQUAL?  PRSA,V?EXAMINE \?ELS21
+       CALL    PERFORM,V?EXAMINE,DIAL
+       RTRUE   
+?ELS21:        EQUAL?  PRSA,V?REZROV \FALSE
+       CALL    JIGS-UP,STR?305
+       RSTACK  
+
+
+       .FUNCT  DIAL-F
+       EQUAL?  PRSA,V?READ,V?EXAMINE \?ELS5
+       PRINTI  "Set in the door is a large circular dial which can be set to any number up to 873. It is currently set to "
+       PRINTN  CURRENT-SETTING
+       PRINTR  "."
+?ELS5: EQUAL?  PRSA,V?TURN \FALSE
+       ZERO?   FWEEPED /?ELS14
+       CALL    BATTY
+       RSTACK  
+?ELS14:        ZERO?   PRSI /?THN18
+       EQUAL?  PRSI,INTNUM /?ELS17
+?THN18:        PRINTR  "You must say what number to turn it to."
+?ELS17:        EQUAL?  CURRENT-SETTING,P-NUMBER \?ELS23
+       PRINTI  "The dial is already set to "
+       PRINTN  CURRENT-SETTING
+       PRINTR  "."
+?ELS23:        SET     'CURRENT-SETTING,P-NUMBER
+       PRINTI  "The dial is now set to "
+       PRINTN  CURRENT-SETTING
+       PRINTI  "."
+       EQUAL?  CURRENT-SETTING,COMBO \?CND30
+       PRINTI  " You hear a click from inside the door."
+       SET     'DIAL-OPEN,TRUE-VALUE
+?CND30:        CRLF    
+       RTRUE   
+
+
+       .FUNCT  ROPE-F
+       EQUAL?  PRSA,V?PUT \?ELS5
+       CALL    ACCESSIBLE?,ROPE
+       ZERO?   STACK /FALSE
+?ELS5: EQUAL?  PRSA,V?TIE \?ELS9
+       EQUAL?  PRSI,BEAM \?ELS9
+       PRINTI  "The rope is "
+       ZERO?   ROPE-TO-BEAM /?CND14
+       PRINTI  "already "
+?CND14:        PRINTI  "tied securely to the center of the beam."
+       CRLF    
+       SET     'ROPE-TO-BEAM,TRUE-VALUE
+       RETURN  ROPE-TO-BEAM
+?ELS9: EQUAL?  PRSA,V?TIE \?ELS23
+       EQUAL?  PRSI,COAL-BIN \?ELS23
+       PRINTR  "The bin is too large."
+?ELS23:        EQUAL?  PRSA,V?UNTIE \?ELS29
+       ZERO?   ROPE-TO-BEAM /?ELS29
+       SET     'ROPE-TO-BEAM,FALSE-VALUE
+       PRINTR  "The rope is untied."
+?ELS29:        EQUAL?  PRSA,V?CLIMB-DOWN \?ELS35
+       ZERO?   ROPE-PLACED \?ELS40
+       ZERO?   ROPE-IN-LOWER-CHUTE \?ELS40
+       PRINTR  "It would be hard to climb down the rope in its current state."
+?ELS40:        CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS35:        EQUAL?  PRSA,V?CLIMB-UP \?ELS48
+       PRINTR  "Do you also charm snakes?"
+?ELS48:        EQUAL?  PRSA,V?EXAMINE \FALSE
+       ZERO?   ROPE-PLACED \?THN58
+       ZERO?   ROPE-IN-LOWER-CHUTE /?ELS57
+?THN58:        PRINTR  "The rope is tied to the beam and hangs into the chute."
+?ELS57:        ZERO?   ROPE-TO-BEAM /FALSE
+       PRINTR  "It is tied to the center of the timber."
+
+
+       .FUNCT  SHAFT-BOTTOM-F,RARG
+       EQUAL?  RARG,M-ENTER \FALSE
+       FSET?   VARDIK-SCROLL,TOUCHBIT \FALSE
+       SET     'BREATH-SHORTAGE,3
+       CALL    I-BREATHE
+       RSTACK  
+
+
+       .FUNCT  SHAFT-PSEUDO
+       EQUAL?  PRSA,V?CLIMB-DOWN \?ELS5
+       EQUAL?  HERE,SHAFT-TOP \?ELS10
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS10:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?CLIMB-UP,V?CLIMB-FOO \?ELS14
+       EQUAL?  HERE,SHAFT-TOP \?ELS19
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS19:        CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS14:        EQUAL?  PRSA,V?PUT-ON \?ELS23
+       EQUAL?  PRSO,BEAM \?ELS23
+       PRINTR  "The shaft is too wide."
+?ELS23:        EQUAL?  PRSA,V?PUT \FALSE
+       EQUAL?  HERE,SHAFT-TOP \FALSE
+       EQUAL?  PRSO,ROPE \?ELS36
+       ZERO?   ROPE-TO-BEAM /?ELS36
+       PRINTR  "The rope now dangles into the shaft."
+?ELS36:        MOVE    PRSO,SHAFT-BOTTOM
+       PRINTR  "It disappears into the shaft. A moment later comes a distant thud."
+
+
+       .FUNCT  BEAM-F
+       EQUAL?  PRSA,V?PUT-ON \?ELS5
+       EQUAL?  PRSI,UPPER-CHUTE,LOWER-CHUTE \?ELS5
+       MOVE    BEAM,HERE
+       PRINTR  "The beam is now lying across the mouth of the chute."
+?ELS5: EQUAL?  PRSA,V?TAKE \?ELS11
+       ZERO?   ROPE-PLACED /?ELS11
+       PRINTR  "You'd have to take the rope out of the chute first."
+?ELS11:        EQUAL?  PRSA,V?EXAMINE \FALSE
+       ZERO?   ROPE-PLACED /?ELS22
+       PRINTR  "A rope hangs from the beam, into the chute."
+?ELS22:        ZERO?   ROPE-TO-BEAM /FALSE
+       PRINTR  "A rope is tied to the beam."
+
+
+       .FUNCT  TOP-OF-CHUTE-F,RARG
+       EQUAL?  RARG,M-END \FALSE
+       IN?     TROGLODYTE,HERE /FALSE
+       ZERO?   LIT \?THN8
+       ZERO?   BLORTED /FALSE
+?THN8: RANDOM  100
+       LESS?   30,STACK /FALSE
+       MOVE    TROGLODYTE,HERE
+       CALL    QUEUE,I-TROGLODYTE,2
+       PUT     STACK,0,1
+       CRLF    
+       PRINTR  "A troglodyte trundles in and dumps a load of coal into the chute."
+
+
+       .FUNCT  I-TROGLODYTE
+       MOVE    TROGLODYTE,DIAL
+       EQUAL?  HERE,TOP-OF-CHUTE \FALSE
+       SET     'TROG-FOLLOW,TRUE-VALUE
+       CALL    QUEUE,I-TROG-UNFOLLOW,1
+       PUT     STACK,0,1
+       CRLF    
+       PRINTR  "The troglodyte trundles off into the coal mine."
+
+
+       .FUNCT  I-TROG-UNFOLLOW
+       SET     'TROG-FOLLOW,FALSE-VALUE
+       RFALSE  
+
+
+       .FUNCT  TROGLODYTE-F
+       EQUAL?  WINNER,TROGLODYTE \?ELS5
+       PRINTI  "The troglodyte ignores you."
+       CRLF    
+       CALL    STOP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?FOLLOW \?ELS9
+       ZERO?   TROG-FOLLOW /?ELS9
+       PRINTR  "You didn't notice which passage it took."
+?ELS9: EQUAL?  PRSA,V?YOMIN \?ELS15
+       PRINTR  "The troglodyte is worried about filling his coal quotas."
+?ELS15:        EQUAL?  PRSA,V?RESEARCH \FALSE
+       PRINTR  "Semi-intelligent subterranean beasts frequently used to dig and haul coal."
+
+
+       .FUNCT  CHUTE-EXIT-F
+       ZERO?   ROPE-PLACED /?ELS5
+       PRINTI  "You climb carefully down the rope, which is slippery with coal dust, "
+       GRTR?   AWAKE,0 \?ELS13
+       PRINTI  "but because of your fatigue you lose your grip."
+       CALL    ORANGE-FLASH
+       CRLF    
+       CRLF    
+       RETURN  COAL-BIN-ROOM
+?ELS13:        CALL    NOTHING-HELD?
+       ZERO?   STACK \?ELS17
+       PRINTI  "but because of your load you are unable to maintain your grip."
+       CALL    ORANGE-FLASH
+       CRLF    
+       CRLF    
+       RETURN  COAL-BIN-ROOM
+?ELS17:        PRINTI  "and soon reach a small opening off the chute. You clamber inside..."
+       CRLF    
+       CRLF    
+       ADD     SCORE,20 >SCORE
+       FCLEAR  VARDIK-SPELL,INVISIBLE
+       RETURN  SLANTED-ROOM
+?ELS5: CALL    ROPE-BEAM-CHECK,TRUE-VALUE
+       PRINTI  "Wheee!!! "
+       CALL    ORANGE-FLASH
+       PRINTI  " You land beside an enormous bin of coal."
+       CRLF    
+       CRLF    
+       RETURN  COAL-BIN-ROOM
+
+
+       .FUNCT  ORANGE-FLASH
+       PRINTI  " As you "
+       ZERO?   FLYING /?ELS5
+       PRINTI  "float"
+       JUMP    ?CND3
+?ELS5: PRINTI  "whiz"
+?CND3: PRINTI  " down the chute, you notice a flash of orange light spilling from an opening onto the chute."
+       RTRUE   
+
+
+       .FUNCT  SLANTED-ROOM-F,RARG
+       EQUAL?  RARG,M-ENTER \FALSE
+       PUT     VEZZAS,6,0
+       RTRUE   
+
+
+       .FUNCT  SLANTED-ROOM-EXIT-F
+       IN?     GOLMAC-SCROLL,PROTAGONIST /?ELS5
+       ZERO?   GOLMACKED \?ELS5
+       CALL    POOF
+       RFALSE  
+?ELS5: IN?     GOLMAC-SCROLL,PROTAGONIST \?ELS9
+       ZERO?   GOLMACKED /?ELS9
+       CALL    POOF
+       RFALSE  
+?ELS9: PRINTI  "Wheeee!!!"
+       CRLF    
+       CRLF    
+       RETURN  COAL-BIN-ROOM
+
+
+       .FUNCT  KEROSENE-LAMP-DESCFCN,RARG
+       PRINTI  "Mounted securely to the wall is a kerosene lamp, filling the room with a serene orange glow. "
+       FSET?   KEROSENE-LAMP,OPENBIT \?CND3
+       PRINTI  "A small compartment at its base is open."
+?CND3: CRLF    
+       RTRUE   
+
+
+       .FUNCT  KEROSENE-LAMP-F
+       EQUAL?  PRSA,V?EXAMINE \?ELS5
+       PRINTR  "The lamp has a glass bowl where the flame burns. Below is a small metal door, perhaps a compartment for storing extra wicks or kerosene."
+?ELS5: EQUAL?  PRSA,V?TAKE \?ELS9
+       PRINTR  "It's mounted securely to the wall."
+?ELS9: EQUAL?  PRSA,V?LAMP-OFF \FALSE
+       PRINTR  "You can't spare the breath to blow out the lamp."
+
+
+       .FUNCT  CHUTE-ENTER-F
+       ZERO?   FLYING /?ELS3
+       PRINTI  "The chute is too narrow to fly up."
+       JUMP    ?CND1
+?ELS3: PRINTI  "The chute is too steep and slippery."
+?CND1: CRLF    
+       RFALSE  
+
+
+       .FUNCT  BOTTOM-TOP-OF-CHUTE,TOP=0
+       PRINTI  "You're already at the "
+       ZERO?   TOP /?ELS5
+       PRINTI  "top"
+       JUMP    ?CND3
+?ELS5: PRINTI  "bottom"
+?CND3: PRINTR  " of the chute."
+
+       .ENDI
diff --git a/end.zap b/end.zap
new file mode 100644 (file)
index 0000000..3871874
--- /dev/null
+++ b/end.zap
@@ -0,0 +1,538 @@
+
+
+       .FUNCT  COVE-F,RARG,X=0
+       EQUAL?  RARG,M-ENTER \FALSE
+       FSET?   COVE,TOUCHBIT /FALSE
+       ZERO?   BOOK-BELONGS-IN-LAGOON /?CND8
+       MOVE    SPELL-BOOK,LAGOON-FLOOR
+?CND8: PUT     VEZZAS,6,0
+       ADD     SCORE,20 >SCORE
+       CALL    INT,I-SUFFOCATE
+       PUT     STACK,0,0
+       CALL    INT,I-YOUNGER-SELF
+       PUT     STACK,0,0
+       CALL    INT,I-OLDER-SELF
+       PUT     STACK,0,0
+       ZERO?   GOLMACKED /?ELS14
+       ZERO?   COMBO-REVEALED \?ELS14
+       CALL    POOF
+       JUMP    ?CND12
+?ELS14:        ZERO?   GOLMACKED \?CND12
+       CALL    HELD?,ROPE
+       ZERO?   STACK /?CND19
+       MOVE    ROPE,DIAL
+       SET     'X,TRUE-VALUE
+?CND19:        CALL    HELD?,BEAM
+       ZERO?   STACK /?CND22
+       MOVE    BEAM,DIAL
+       SET     'X,TRUE-VALUE
+?CND22:        CALL    HELD?,VARDIK-SCROLL
+       ZERO?   STACK /?CND25
+       MOVE    VARDIK-SCROLL,DIAL
+       SET     'X,TRUE-VALUE
+?CND25:        CALL    HELD?,GOLMAC-SCROLL
+       ZERO?   STACK /?CND28
+       MOVE    GOLMAC-SCROLL,DIAL
+       SET     'X,TRUE-VALUE
+?CND28:        ZERO?   X /?CND12
+       PRINTI  "As you slide down the chute, some of your possessions suddenly vanish! "
+?CND12:        PRINTI  "You fly out of the chute and land just at the edge of some water..."
+       CRLF    
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  POOF
+       SET     'POOFED,TRUE-VALUE
+       PRINTI  "Suddenly, without the slightest fanfare, you cease to exist!"
+       CRLF    
+       CALL    FINISH
+       RSTACK  
+
+
+       .FUNCT  OCEAN-SHORE-F,RARG
+       EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "You are "
+       ZERO?   FLYING /?ELS10
+       PRINTI  "floating above"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "standing on"
+?CND8: PRINTI  " the western shore of the mighty Flathead Ocean. According to legends you read at the University, the eastern shore of this ocean is a strange land of magical beings and priceless treasures. "
+       EQUAL?  HERE,OCEAN-NORTH \?ELS22
+       PRINTI  "You could go north along the shore; the edge of a small cove lies to the southwest."
+       JUMP    ?CND20
+?ELS22:        PRINTI  "The beach to the south is blocked by a tall cliff; a lagoon shore lies to the northwest."
+?CND20:        CRLF    
+       RTRUE   
+
+
+       .FUNCT  OCEAN-F,X=0
+       EQUAL?  HERE,GUN-EMPLACEMENT,TURRET,TOP-OF-FALLS \?ELS5
+       PRINTR  "The ocean lies far below you."
+?ELS5: EQUAL?  PRSA,V?PULVER \?ELS9
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,V?PULVER,LAGOON-OBJECT
+       RTRUE   
+?ELS9: EQUAL?  PRSA,V?DRINK-FROM,V?DRINK \?ELS11
+       CALL    PERFORM,V?DRINK,WATER
+       RTRUE   
+?ELS11:        EQUAL?  PRSA,V?EXAMINE \?ELS13
+       PRINTR  "It streches east as far as the eye can see."
+?ELS13:        EQUAL?  PRSA,V?RESEARCH \?ELS17
+       PRINTR  "The Flathead Ocean, called the Great Sea by the ancients, has a very unusual feature -- its western shore basks in the sunlight while its eastern shore lies far underground."
+?ELS17:        EQUAL?  PRSA,V?PUT \?ELS21
+       EQUAL?  OCEAN,PRSI \?ELS21
+       MOVE    PRSO,DIAL
+       CALL    SPLASH
+       RSTACK  
+?ELS21:        EQUAL?  PRSA,V?THROUGH \FALSE
+       CALL    JIGS-UP,STR?318
+       RSTACK  
+
+
+       .FUNCT  CLIFF-PSEUDO
+       EQUAL?  PRSA,V?CLIMB-FOO,V?CLIMB-UP \FALSE
+       ZERO?   FLYING /?ELS10
+       PRINTR  "The cliff is too high to fly over."
+?ELS10:        PRINTR  "The cliff is unclimbable."
+
+
+       .FUNCT  LAGOON-OBJECT-F
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       EQUAL?  HERE,LAGOON,LAGOON-FLOOR \?ELS10
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS10:        CALL    GOTO,LAGOON
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?PUT \?ELS14
+       EQUAL?  HERE,LAGOON-FLOOR /?ELS14
+       EQUAL?  PRSI,LAGOON-OBJECT \?ELS14
+       MOVE    PRSO,LAGOON-FLOOR
+       FSET?   PRSO,SCROLLBIT /?THN20
+       EQUAL?  PRSO,SPELL-BOOK \?CND17
+?THN20:        FSET    PRSO,MUNGBIT
+?CND17:        CALL    SPLASH
+       RSTACK  
+?ELS14:        EQUAL?  PRSA,V?EXAMINE \?ELS23
+       PRINTR  "The water looks calm and hospitable."
+?ELS23:        EQUAL?  PRSA,V?DRINK-FROM,V?DRINK \?ELS27
+       CALL    PERFORM,V?DRINK,WATER
+       RTRUE   
+?ELS27:        EQUAL?  PRSA,V?PULVER \FALSE
+       PRINTR  "The water level seems to drop an inch or two, for a moment."
+
+
+       .FUNCT  LAGOON-F,RARG,X
+       EQUAL?  RARG,M-ENTER \?ELS5
+       FIRST?  PROTAGONIST >X /?KLU35
+?KLU35:        
+?PRG6: ZERO?   X /TRUE
+       FSET?   X,SCROLLBIT /?THN15
+       EQUAL?  X,SPELL-BOOK \?CND12
+?THN15:        FSET    X,MUNGBIT
+?CND12:        NEXT?   X >X /?KLU36
+?KLU36:        JUMP    ?PRG6
+?ELS5: EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "You are "
+       ZERO?   FLYING /?ELS25
+       PRINTI  "flying over"
+       JUMP    ?CND23
+?ELS25:        PRINTI  "swimming on"
+?CND23:        PRINTR  " the surface of a calm lagoon, whose sandy floor is visible below. A curved beach surrounds this inlet on its western side."
+
+
+       .FUNCT  LAGOON-FLOOR-ENTER-F
+       ZERO?   FLYING /?ELS5
+       CALL    WHILE-FLYING
+       RFALSE  
+?ELS5: RETURN  LAGOON-FLOOR
+
+
+       .FUNCT  SAND-PSEUDO
+       EQUAL?  PSEUDO-OBJECT,PRSO \?ELS5
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,GROUND,PRSI
+       RTRUE   
+?ELS5: SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,GROUND
+       RTRUE   
+
+
+       .FUNCT  LAGOON-FLOOR-F,RARG
+       EQUAL?  RARG,M-ENTER \FALSE
+       CALL    QUEUE,I-DROWN,-1
+       PUT     STACK,0,1
+       RFALSE  
+
+
+       .FUNCT  I-DROWN
+       EQUAL?  HERE,LAGOON-FLOOR \?ELS5
+       ZERO?   VILSTUED \FALSE
+       INC     'UNDERWATER-COUNTER
+       EQUAL?  UNDERWATER-COUNTER,3 \?ELS14
+       CRLF    
+       PRINTR  "You won't be able to hold your breath much longer."
+?ELS14:        EQUAL?  UNDERWATER-COUNTER,4 \?ELS18
+       CRLF    
+       PRINTR  "Better get some fresh air soon!"
+?ELS18:        EQUAL?  UNDERWATER-COUNTER,5 \FALSE
+       SET     'UNDERWATER-COUNTER,0
+       CRLF    
+       CALL    JIGS-UP,STR?320
+       RSTACK  
+?ELS5: SET     'UNDERWATER-COUNTER,0
+       CALL    INT,I-DROWN
+       PUT     STACK,0,0
+       RFALSE  
+
+
+       .FUNCT  CORAL-PSEUDO
+       EQUAL?  PRSA,V?EXAMINE \FALSE
+       IN?     HERE,SPENSEWEEDS \FALSE
+       PRINTR  "The coral is covered by swaying spenseweeds."
+
+
+       .FUNCT  SPENSEWEEDS-F
+       EQUAL?  PRSA,V?MEEF \?ELS5
+       MOVE    SPENSEWEEDS,DIAL
+       MOVE    CRATE,HERE
+       CALL    THIS-IS-IT,CRATE
+       PRINTR  "The spenseweeds wilt away, revealing a wooden crate labelled with black lettering."
+?ELS5: EQUAL?  PRSA,V?LOOK-UNDER \FALSE
+       PRINTR  "That's difficult -- they're well rooted in the coral."
+
+
+       .FUNCT  CRATE-F
+       EQUAL?  PRSA,V?REZROV,V?OPEN \?ELS5
+       ZERO?   CRATE-POINT \?ELS5
+       SET     'CRATE-POINT,TRUE-VALUE
+       ADD     SCORE,15 >SCORE
+       RFALSE  
+?ELS5: EQUAL?  PRSA,V?READ \FALSE
+       CALL    FIXED-FONT-ON
+       PRINTI  "Stencilled diagonally across the crate:
+
+    GRUE PROTECTION KIT
+
+Below, in much smaller letters:
+
+    FROM:
+    Frobozz Magic Grue Accessories Co.
+
+    TO:
+    Aragain Brothers Circus
+    Attn: Grue Trainer"
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  BRASS-LANTERN-F
+       EQUAL?  PRSA,V?EXAMINE \FALSE
+       PRINTI  "It is a battery-powered lantern like those used by adventurers and explorers. It is currently "
+       FSET?   BRASS-LANTERN,ONBIT \?ELS10
+       PRINTI  "on"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "off"
+?CND8: PRINTR  "."
+
+
+       .FUNCT  GRUE-REPELLENT-F
+       EQUAL?  PRSA,V?SHAKE \?ELS5
+       ZERO?   SPRAY-USED? /?ELS10
+       PRINTR  "The can seems empty."
+?ELS10:        PRINTR  "There is a sloshing sound from inside."
+?ELS5: EQUAL?  PRSA,V?PUT-ON,V?SPRAY \FALSE
+       EQUAL?  PRSO,GRUE-REPELLENT \FALSE
+       ZERO?   SPRAY-USED? /?ELS26
+       PRINTR  "The repellent is all gone."
+?ELS26:        ZERO?   PRSI \?ELS31
+       SET     'SPRAY-USED?,TRUE-VALUE
+       PRINTR  "The spray stinks amazingly for a few moments, then drifts away."
+?ELS31:        EQUAL?  PRSI,ME \?CND36
+       CALL    QUEUE,I-SPRAY,5
+       PUT     STACK,0,1
+       SET     'SPRAYED?,TRUE-VALUE
+?CND36:        SET     'SPRAY-USED?,TRUE-VALUE
+       PRINTR  "The spray smells like a mixture of old socks and burning rubber. If I were a grue I'd sure stay clear!"
+
+
+       .FUNCT  I-SPRAY
+       SET     'SPRAYED?,FALSE-VALUE
+       CRLF    
+       PRINTR  "That horrible smell is much less pungent now."
+
+
+       .FUNCT  MOUTH-OF-RIVER-F,RARG
+       EQUAL?  RARG,M-LOOK \?ELS5
+       PRINTI  "A mighty river spills into the ocean here. Looking up the river valley, you see a tall waterfall. Atop a cliff, high above you, is the rampart of a fortress. A cave entrance "
+       IN?     VINES,HERE \?ELS10
+       PRINTI  "at the base of the cliff to the west is blocked by writhing green vines"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "lies to the west"
+?CND8: PRINTR  "."
+?ELS5: EQUAL?  RARG,M-END \FALSE
+       IN?     VINES,HERE \FALSE
+       RANDOM  100
+       LESS?   15,STACK /FALSE
+       CRLF    
+       PRINTI  "Suddenly you realize that, without really thinking about it, you were "
+       ZERO?   FLYING /?ELS27
+       PRINTI  "flying"
+       JUMP    ?CND25
+?ELS27:        PRINTI  "walking"
+?CND25:        PRINTR  " toward the wriggling vines. As you stop, a feeling of annoyance seems to radiate from the plants."
+
+
+       .FUNCT  VINES-F
+       EQUAL?  PRSA,V?MEEF \?ELS5
+       MOVE    VINES,DIAL
+       PRINTR  "You can almost feel a wave of pain from the vines as they shrivel away."
+?ELS5: EQUAL?  PRSA,V?KILL,V?ATTACK \?ELS9
+       CALL    JIGS-UP,STR?324
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?BITE,V?KICK,V?THROUGH /?THN12
+       EQUAL?  PRSA,V?CLIMB-FOO,V?CLIMB-UP,V?TAKE /?THN12
+       EQUAL?  PRSA,V?RUB,V?MOVE,V?PUSH \FALSE
+?THN12:        CALL    DO-WALK,P?WEST
+       RSTACK  
+
+
+       .FUNCT  VINES-EXIT-F
+       IN?     VINES,HERE \?ELS5
+       CALL    JIGS-UP,STR?325
+       RFALSE  
+?ELS5: RETURN  GRUE-LAIR
+
+
+       .FUNCT  GRUE-LAIR-F,RARG
+       ZERO?   SPRAYED? \FALSE
+       EQUAL?  RARG,M-END \FALSE
+       IN?     GRUE-SUIT,PROTAGONIST /FALSE
+       ZERO?   LIT \?THN13
+       ZERO?   BLORTED /?ELS12
+?THN13:        CALL    JIGS-UP,STR?327
+       RSTACK  
+?ELS12:        CALL    JIGS-UP,STR?328
+       RSTACK  
+
+
+       .FUNCT  MUTATED-GRUES-F
+       EQUAL?  PRSA,V?FROTZ \?ELS5
+       PRINTR  "One of the grues gives off a flash of light but, strangely, it doesn't seem to notice or care."
+?ELS5: EQUAL?  PRSA,V?RESEARCH \FALSE
+       CALL    PERFORM,V?RESEARCH,GRUE
+       RTRUE   
+
+
+       .FUNCT  MUTATED-GRUES-DESCFCN,RARG
+       ZERO?   LIT \?THN6
+       ZERO?   BLORTED /?ELS5
+?THN6: ZERO?   SPRAYED? /?ELS12
+       CALL    LIT-MESSAGE
+       PRINTR  "They stagger about the room, covering their noses and making horrid gurgling noises."
+?ELS12:        IN?     GRUE-SUIT,PROTAGONIST \?ELS17
+       CALL    LIT-MESSAGE
+       PRINTR  "They seem to be ignoring you, aside from a few suspicious gurgles in your direction."
+?ELS17:        CALL    LIT-MESSAGE
+       PRINTR  "Baring tremendous fangs, they form a circle around you..."
+?ELS5: PRINTR  "There are terrifying gurgling noises from the darkness!"
+
+
+       .FUNCT  LIT-MESSAGE
+       PRINTI  "A pack of grues fills the room! "
+       ZERO?   LIT /FALSE
+       PRINTI  "The grues, contrary to all conventional wisdom, aren't bothered by your light in the least. They must be mutated grues, no longer fearing light! "
+       RTRUE   
+
+
+       .FUNCT  MAMMOTH-CAVERN-F,RARG
+       EQUAL?  RARG,M-ENTER \FALSE
+       ADD     SCORE,CAVERN-POINT >SCORE
+       SET     'CAVERN-POINT,0
+       PUT     VEZZAS,7,0
+       RTRUE   
+
+
+       .FUNCT  MACHINERY-F
+       EQUAL?  PRSA,V?LAMP-ON,V?MUNG \?ELS5
+       CALL    JIGS-UP,STR?330
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?READ,V?EXAMINE \FALSE
+       PRINTR  "You notice, on one machine, a tiny plaque which reads:
+
+FROBOZZ MAGIC MUTATED GRUE BREEDER CO."
+
+
+       .FUNCT  CHAMBER-OF-LIVING-DEATH-F,RARG
+       EQUAL?  RARG,M-BEG \?ELS5
+       EQUAL?  PRSA,V?VERSION,V?SAVE,V?QUIT /?ELS5
+       EQUAL?  PRSA,V?RESTART,V?RESTORE /?ELS5
+       EQUAL?  PRSA,V?SUPER-BRIEF,V?VERBOSE,V?BRIEF /?ELS5
+       EQUAL?  PRSA,V?UNSCRIPT,V?SCRIPT /?ELS5
+       CALL    AGONY
+       RTRUE   
+?ELS5: EQUAL?  RARG,M-END \FALSE
+       PRINTR  "Hideous parasites descend upon you and tear the flesh from your bones, gnaw the eyes from your sockets, and feast upon your very brain tissue. Amazingly, you do not die, and your body regenerates itself as you await the next attack..."
+
+
+       .FUNCT  PARASITES-PSEUDO
+       RFALSE  
+
+
+       .FUNCT  HALL-OF-ETERNAL-DEATH-F,RARG
+       EQUAL?  RARG,M-BEG \?ELS5
+       EQUAL?  PRSA,V?VERSION,V?SAVE,V?QUIT /?ELS5
+       EQUAL?  PRSA,V?RESTART,V?RESTORE /?ELS5
+       EQUAL?  PRSA,V?SUPER-BRIEF,V?VERBOSE,V?BRIEF /?ELS5
+       EQUAL?  PRSA,V?UNSCRIPT,V?SCRIPT /?ELS5
+       CALL    AGONY
+       RTRUE   
+?ELS5: EQUAL?  RARG,M-END \FALSE
+       PRINTR  "Disembodied forces suck the very thoughts from your mind, savoring each moment and growing stronger. Every second is an agonizing torment, as though thousands of raging fires were exploding in your skull, filling you with a pain greater than you could ever imagine."
+
+
+       .FUNCT  FORCE-PSEUDO
+       RFALSE  
+
+
+       .FUNCT  AGONY
+       PRINTR  "Your agony is too great to concentrate on such an action."
+
+
+       .FUNCT  BLACK-DOOR-F
+       EQUAL?  PRSA,V?REZROV,V?OPEN \FALSE
+       PRINTI  "As the door opens, hundreds of slime-covered tentacles stream out and drag you across the threshold..."
+       CRLF    
+       CRLF    
+       CALL    ROB,PROTAGONIST
+       CALL    INT,I-TIRED
+       PUT     STACK,0,0
+       CALL    INT,I-THIRST
+       PUT     STACK,0,0
+       CALL    INT,I-HUNGER
+       PUT     STACK,0,0
+       CALL    WEAR-OFF-SPELLS
+       CALL    GOTO,CHAMBER-OF-LIVING-DEATH
+       RSTACK  
+
+
+       .FUNCT  SILVER-DOOR-F
+       EQUAL?  PRSA,V?REZROV,V?OPEN \FALSE
+       PRINTI  "The door blows open, knocking you to the ground. You are pulled through the open doorway by an unseen force..."
+       CRLF    
+       CRLF    
+       CALL    ROB,PROTAGONIST
+       CALL    INT,I-TIRED
+       PUT     STACK,0,0
+       CALL    INT,I-HUNGER
+       PUT     STACK,0,0
+       CALL    INT,I-THIRST
+       PUT     STACK,0,0
+       CALL    WEAR-OFF-SPELLS
+       CALL    GOTO,HALL-OF-ETERNAL-PAIN
+       RSTACK  
+
+
+       .FUNCT  WHITE-DOOR-F
+       EQUAL?  PRSA,V?REZROV,V?OPEN \FALSE
+       EQUAL?  HERE,BELBOZ-HIDEOUT \?CND6
+       CALL    DO-WALK,P?EAST
+       RTRUE   
+?CND6: ADD     SCORE,WHITE-DOOR-SCORE >SCORE
+       SET     'WHITE-DOOR-SCORE,0
+       PRINTI  "The door creaks slowly open. Within, you see someone lying as though asleep. You feel yourself drawn into the room..."
+       CRLF    
+       CRLF    
+       CALL    QUEUE,I-BELBOZ-AWAKES,8
+       PUT     STACK,0,1
+       CALL    GOTO,BELBOZ-HIDEOUT
+       RSTACK  
+
+
+       .FUNCT  I-UNVARDIK
+       SET     'VARDIKED,FALSE-VALUE
+       CRLF    
+       PRINTR  "Your head feels numb for a moment, and your mind feels suddenly open and unprotected."
+
+
+       .FUNCT  KILL-BELBOZ
+       ZERO?   BELBOZ-GASPARED /?ELS5
+       SET     'BELBOZ-GASPARED,FALSE-VALUE
+       PRINTI  "As you stab Belboz, an apparition rises from his body. Floating above him like a cloud of fog, it howls with laughter. A moment later, gaspar begins to heal the wounds, and the spirit flows back into the body."
+       CRLF    
+       CRLF    
+       CALL    I-BELBOZ-AWAKES
+       RSTACK  
+?ELS5: PRINTI  "You stab the knife time and again into Belboz, who writhes in pain, eyes bulging outward. Sickened and dizzy, you stagger back."
+       CRLF    
+       CRLF    
+       SET     'BELBOZ-DEAD,TRUE-VALUE
+       CALL    SWANZO-BELBOZ
+       RSTACK  
+
+
+       .FUNCT  SWANZO-BELBOZ
+       PRINTI  "A wispy translucent shape rises from the "
+       ZERO?   BELBOZ-DEAD /?ELS5
+       PRINTI  "corpse"
+       JUMP    ?CND3
+?ELS5: PRINTI  "body"
+?CND3: PRINTI  " of Belboz. It speaks in a voice so deep that your whole body seems to hear it. ""Foolish Charlatan! I am forced to flee that weak, old body -- I shall take your own, instead! Already I have sucked all knowledge, all secrets from that ancient Enchanter. Now begins an epoch of evil transcending even your worst nightmares; a reign of terror that will last a thousand thousand years!"" The shape blows toward you on a cold wind."
+       CRLF    
+       CRLF    
+       ZERO?   VARDIKED /?ELS19
+       PRINTI  "Jeearr surrounds you like a cloud and begins to contract. Suddenly, it strikes your invisible protection and recoils as if burned. ""No!"" it cries. ""Such a guileless Enchanter developing a mind shield?"" The cloud is thinner, the voice fainter. ""It cannot be! I cannot survive ... without a host."" The demon roils in agony, then thins and dissipates. There is a final scream of pain, then silence."
+       CRLF    
+       CRLF    
+       ZERO?   BELBOZ-DEAD /?ELS27
+       PRINTI  "Jeearr is vanquished; the kingdom is saved. But you - you are stranded in a land unknown, and your closest friend, the greatest Enchanter of his age, lies dead by your own hand. Kneeling by his blood-soaked corpse, you beg for another chance..."
+       CRLF    
+       CALL    FINISH
+       RSTACK  
+?ELS27:        PRINTI  "Belboz moans softly, and begins stirring. He sees you and rises, instantly alert. After posing a few well-chosen questions, he casts a brief but unfamiliar spell.
+
+An instant later, "
+       IN?     GRUE-SUIT,PROTAGONIST \?CND35
+       PRINTI  "your grue suit has vanished and "
+?CND35:        PRINTI  "you are standing in the Chamber of the Circle. The Circle of Enchanters is assembled. Belboz speaks. ""Once again, this young Enchanter has done a matchless service to the Guild and to the entire kingdom, displaying resourcefulness and imagination worthy of the greatest of Enchanters. I grow old, and must soon step down as Head of the Circle. But let it be known that a successor has been found."""
+       CRLF    
+       CRLF    
+       ADD     SCORE,25 >SCORE
+       SET     'HERE,CHAMBER-OF-THE-CIRCLE
+       CALL    V-SCORE
+       USL     
+       CRLF    
+       PRINTI  "Here ends the second chapter of the Enchanter saga, in which, by virtue of your skills, you have been appointed as the next leader of the Circle of Enchanters. The final adventure awaits you as the Enchanter series concludes."
+       CRLF    
+       IN?     MORGIA-PLANT,BELBOZ-QUARTERS /?CND44
+       CRLF    
+       PRINTI  "You hear a distant bellow. ""What happened to my morgia plant?"""
+       CRLF    
+?CND44:        CALL    FINISH,TRUE-VALUE
+       RSTACK  
+?ELS19:        PRINTI  "You feel an overwhelming sense of oppression as the demon seizes control of your mind and body. The monster reaches into the recesses of your mind, adding your hard-earned magic powers to its own. As it settles comfortably into your skull, the demon grants you a vision of the future. You see the enslaved people of the land toiling to erect great idols to Jeearr. Parents offer up their own children upon these altars, as the rivers of the land fill with blood. And YOU embody Jeearr; you are cursed by ten thousand generations of victims; your face adorns the idols. And worst of all, you remain awake and aware, a witness to horror, never sleeping, and never, ever to escape."
+       CRLF    
+       SET     'SCORE,-99
+       CALL    FINISH
+       RSTACK  
+
+
+       .FUNCT  I-BELBOZ-AWAKES
+       EQUAL?  HERE,BELBOZ-HIDEOUT \FALSE
+       CRLF    
+       PRINTI  "Suddenly, Belboz's eyes flicker and he leaps to his feet. His face is unrecognizable, a twisted mask of hatred. ""Meddlesome Enchanter! I should have killed you all before I left! But better late than never..."" Lightning bolts flash toward you from his fingers, but rather than dying, you find yourself in the..."
+       CRLF    
+       CRLF    
+       CALL    ROB,PROTAGONIST
+       CALL    INT,I-TIRED
+       PUT     STACK,0,0
+       CALL    INT,I-THIRST
+       PUT     STACK,0,0
+       CALL    INT,I-HUNGER
+       PUT     STACK,0,0
+       CALL    WEAR-OFF-SPELLS
+       CALL    GOTO,HALL-OF-ETERNAL-PAIN
+       RSTACK  
+
+       .ENDI
diff --git a/end.zil b/end.zil
index e605d4437135b7da9d91d7bc48cb395cef0c5a6d..d84b334da9446d841505e66f0123a44c1107209a 100644 (file)
--- a/end.zil
+++ b/end.zil
@@ -641,7 +641,7 @@ as though you're floating in the center of an infinite void.")
 <ROUTINE CHAMBER-OF-LIVING-DEATH-F (RARG)
         <COND (<AND <EQUAL? .RARG ,M-BEG>
                     <NOT <VERB? QUIT SAVE VERSION>>
-                    <NOT <VERB? RESTORE RESTART AGAIN>>
+                    <NOT <VERB? RESTORE RESTART ;AGAIN>>
                     <NOT <VERB? BRIEF VERBOSE SUPER-BRIEF>>
                     <NOT <VERB? SCRIPT UNSCRIPT>>>
                <AGONY>
@@ -669,7 +669,7 @@ the next attack..." CR>)>>
 <ROUTINE HALL-OF-ETERNAL-DEATH-F (RARG)
         <COND (<AND <EQUAL? .RARG ,M-BEG>
                     <NOT <VERB? QUIT SAVE VERSION>>
-                    <NOT <VERB? RESTORE RESTART AGAIN>>
+                    <NOT <VERB? RESTORE RESTART ;AGAIN>>
                     <NOT <VERB? BRIEF VERBOSE SUPER-BRIEF>>
                     <NOT <VERB? SCRIPT UNSCRIPT>>>
                <AGONY>
@@ -868,7 +868,7 @@ offer up their own children upon these altars, as the rivers of the land fill
 with blood. And YOU embody Jeearr; you are cursed by ten thousand generations
 of victims; your face adorns the idols. And worst of all, you remain awake
 and aware, a witness to horror, never sleeping, and never, ever to escape." CR>
-               <SETG SCORE -100>
+               <SETG SCORE -99>
                <FINISH>)>>
 
 <ROUTINE I-BELBOZ-AWAKES ()
diff --git a/fort.zap b/fort.zap
new file mode 100644 (file)
index 0000000..ad03c09
--- /dev/null
+++ b/fort.zap
@@ -0,0 +1,233 @@
+
+
+       .FUNCT  FORT-F
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       EQUAL?  HERE,PARADE-GROUND,GUN-EMPLACEMENT /?THN11
+       EQUAL?  HERE,BARRACKS,ARMORY \?ELS10
+?THN11:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS10:        EQUAL?  HERE,FORT-ENTRANCE \?ELS14
+       CALL    DO-WALK,P?EAST
+       RSTACK  
+?ELS14:        CALL    CANT-ENTER,FORT
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?EXIT,V?DROP \?ELS18
+       EQUAL?  HERE,PARADE-GROUND \?ELS23
+       CALL    DO-WALK,P?WEST
+       RSTACK  
+?ELS23:        EQUAL?  HERE,GUN-EMPLACEMENT,BARRACKS,ARMORY \?ELS25
+       CALL    CANT-ENTER,FORT,TRUE-VALUE
+       RSTACK  
+?ELS25:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS18:        EQUAL?  PRSA,V?RESEARCH \FALSE
+       PRINTR  "Fort Griffspotter once guarded the lands near Egreth Castle from attack by sea."
+
+
+       .FUNCT  PARADE-GROUND-F,RARG
+       EQUAL?  RARG,M-ENTER \?ELS5
+       PUT     VEZZAS,2,0
+       RFALSE  
+?ELS5: EQUAL?  RARG,M-END \FALSE
+       ZERO?   SLEEPING /FALSE
+       CALL    INT,I-WAKE-UP
+       PUT     STACK,0,0
+       CALL    I-WAKE-UP
+       RSTACK  
+
+
+       .FUNCT  ROPE-PSEUDO
+       EQUAL?  PRSA,V?MOVE \?ELS5
+       CALL    PERFORM,V?LOWER,FLAG
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?TAKE \FALSE
+       PRINTR  "The rope is attached to the pole and can't possibly be removed."
+
+
+       .FUNCT  FLAG-POLE-F
+       EQUAL?  PRSA,V?CLIMB-UP,V?CLIMB-FOO,V?CLIMB-ON \?ELS5
+       PRINTR  "That sort of thing went out of fashion years ago."
+?ELS5: EQUAL?  PRSA,V?EXAMINE \FALSE
+       PRINTR  "A rope runs up the side of the pole."
+
+
+       .FUNCT  FLAG-DESCFCN,RARG
+       ZERO?   FLAG-RAISED /?ELS5
+       PRINTR  "A tattered flag, apparently that of ancient Quendor, still flies atop a mighty flagpole in the center of the field."
+?ELS5: PRINTR  "A flag displaying the brown and gold of ancient Quendor is lying here."
+
+
+       .FUNCT  FLAG-F
+       EQUAL?  PRSA,V?FLY \?CND1
+       CALL    PERFORM,V?RAISE,FLAG
+       RTRUE   
+?CND1: ZERO?   FLAG-RAISED /?ELS8
+       EQUAL?  PRSA,V?RAISE \?ELS14
+       PRINTR  "It's already at the top of the pole."
+?ELS14:        EQUAL?  PRSA,V?LOWER \?ELS18
+       SET     'FLAG-RAISED,FALSE-VALUE
+       FCLEAR  FLAG,TRYTAKEBIT
+       FCLEAR  FLAG-POLE,NDESCBIT
+       PRINTR  "The flag is lowered to the ground."
+?ELS18:        EQUAL?  PRSA,V?EXAMINE \?ELS22
+       PRINTR  "You can't see it very well from here -- the flagpole is very tall."
+?ELS22:        EQUAL?  PRSA,V?TAKE,V?WAVE,V?SHAKE /?THN27
+       EQUAL?  PRSA,V?EAT,V?RUB,V?MOVE /?THN27
+       EQUAL?  PRSA,V?LOOK-INSIDE,V?DRINK \?ELS26
+?THN27:        PRINTI  "The flag is "
+       ZERO?   FLYING /?CND31
+       PRINTI  "still "
+?CND31:        PRINTR  "way above you at the top of the flagpole!"
+?ELS26:        EQUAL?  PRSA,V?LOOK-UNDER \FALSE
+       CALL    PERFORM,V?EXAMINE,FLAG-POLE
+       RTRUE   
+?ELS8: EQUAL?  PRSA,V?RAISE \?ELS47
+       EQUAL?  HERE,PARADE-GROUND \?ELS52
+       FSET    FLAG,TRYTAKEBIT
+       MOVE    FLAG,HERE
+       FSET    FLAG-POLE,NDESCBIT
+       SET     'FLAG-RAISED,TRUE-VALUE
+       PRINTR  "The flag is raised to the top of the pole."
+?ELS52:        PRINTR  "There's no flagpole in sight."
+?ELS47:        EQUAL?  PRSA,V?LOWER \?ELS60
+       PRINTR  "You've already done that."
+?ELS60:        EQUAL?  PRSA,V?WAVE \?ELS64
+       PRINTR  "How patriotic!"
+?ELS64:        EQUAL?  PRSA,V?WEAR \?ELS68
+       PRINTR  "Who do you think you are, Abbie Hoffman?"
+?ELS68:        EQUAL?  PRSA,V?SHAKE,V?LOOK-INSIDE,V?EXAMINE /?THN75
+       EQUAL?  PRSA,V?SEARCH,V?RUB \?ELS72
+?THN75:        ZERO?   FOOBLE-FOUND \?ELS72
+       SET     'FOOBLE-FOUND,TRUE-VALUE
+       MOVE    FOOBLE-VIAL,HERE
+       CALL    THIS-IS-IT,FOOBLE-VIAL
+       PRINTR  "As you fiddle with the flag, an aqua vial drops from a hidden pocket and falls to the ground."
+?ELS72:        EQUAL?  PRSA,V?EXAMINE \FALSE
+       PRINTR  "The tattered flag displays the brown and gold of ancient Quendor."
+
+
+       .FUNCT  FOOBLE-VIAL-F
+       EQUAL?  PRSA,V?READ \FALSE
+       CALL    FIXED-FONT-ON
+       PRINTI  "
+        ""FOOBLE POTION
+(increase muscular coordination)"""
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  FOOBLE-POTION-F
+       EQUAL?  PRSA,V?DRINK,V?EAT \?ELS5
+       CALL    HELD?,FOOBLE-VIAL
+       ZERO?   STACK \?ELS5
+       CALL    POTION-POUR,FOOBLE-VIAL
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?RESEARCH \?ELS9
+       CALL    READ-ABOUT-POTIONS,2
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?DRINK,V?EAT \?ELS11
+       MOVE    FOOBLE-POTION,DIAL
+       ZERO?   UNDER-INFLUENCE /?CND12
+       CALL    TWO-POTIONS
+       RTRUE   
+?CND12:        SET     'UNDER-INFLUENCE,FOOBLE-POTION
+       CALL    QUEUE,I-UNFOOBLE,17
+       PUT     STACK,0,1
+       SET     'FOOBLED,TRUE-VALUE
+       PRINTR  "The aqua potion tasted like lime jelly, and sent vibrations through your muscles."
+?ELS11:        EQUAL?  PRSA,V?DROP \?ELS19
+       CALL    PERFORM,V?POUR,PRSO,PRSI
+       RTRUE   
+?ELS19:        EQUAL?  PRSA,V?POUR \FALSE
+       EQUAL?  PRSO,FOOBLE-POTION \FALSE
+       CALL    POTION-POUR,FOOBLE-VIAL
+       RSTACK  
+
+
+       .FUNCT  I-UNFOOBLE
+       SET     'FOOBLED,FALSE-VALUE
+       EQUAL?  UNDER-INFLUENCE,FOOBLE-POTION \?CND1
+       SET     'UNDER-INFLUENCE,FALSE-VALUE
+?CND1: CRLF    
+       PRINTR  "Your muscles feel limp for a moment."
+
+
+       .FUNCT  BARRACKS-PSEUDO
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,GLOBAL-ROOM,PRSI
+       RTRUE   
+
+
+       .FUNCT  EMPLACEMENT-EXIT-F
+       ZERO?   FLYING /?ELS3
+       PRINTI  "The updrafts from the "
+       EQUAL?  PRSO,P?NORTH \?ELS9
+       PRINTI  "river"
+       JUMP    ?CND1
+?ELS9: PRINTI  "ocean"
+       JUMP    ?CND1
+?ELS3: PRINTI  "The plunge"
+?CND1: PRINTI  " would kill you."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  CANNON-F
+       EQUAL?  PRSA,V?LAMP-ON,V?SHOOT \?ELS5
+       PRINTR  "This cannon probably hasn't worked for centuries!"
+?ELS5: EQUAL?  PRSA,V?CLOSE \?ELS9
+       CALL    V-DEFLATE
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?SEARCH,V?REACH-IN \?ELS11
+       FSET?   YIPPLES,INVISIBLE \?ELS11
+       SET     'BITTEN,TRUE-VALUE
+       CALL    QUEUE,I-BITE-HEAL,20
+       PUT     STACK,0,1
+       PRINTR  "Something bites your hand!"
+?ELS11:        EQUAL?  PRSA,V?LOOK-INSIDE \?ELS17
+       FSET?   YIPPLES,INVISIBLE \?ELS17
+       FCLEAR  YIPPLES,INVISIBLE
+       PRINTR  "Lying at the bottom of the barrel is a pile of identical scrolls!"
+?ELS17:        EQUAL?  PRSA,V?EXAMINE \?ELS23
+       PRINTR  "The barrel is wide enough to hold the hugest of cannonballs, but it isn't very deep."
+?ELS23:        EQUAL?  PRSA,V?SEARCH,V?REACH-IN \?ELS27
+       IN?     YIPPLES,CANNON \?ELS27
+       CALL    PERFORM,V?TAKE,YIPPLES
+       RTRUE   
+?ELS27:        EQUAL?  PRSA,V?PUT \?ELS31
+       IN?     YIPPLES,CANNON \?ELS31
+       EQUAL?  BAT-GUANO,PRSO \?ELS31
+       MOVE    YIPPLES,DIAL
+       MOVE    YONK-SCROLL,CANNON
+       CALL    THIS-IS-IT,YONK-SCROLL
+       MOVE    BAT-GUANO,CANNON
+       PRINTI  "When you drop the guano into the barrel, "
+       FSET?   YIPPLES,INVISIBLE \?ELS38
+       PRINTI  "dozens of scrolls pour out and literally run off"
+       JUMP    ?CND36
+?ELS38:        PRINTI  "the scrolls sprout feet and spill out of the cannon, dashing away"
+?CND36:        PRINTI  " in every direction! A single ordinary scroll is left sitting at the bottom of the barrel."
+       CRLF    
+       FCLEAR  YIPPLES,INVISIBLE
+       RTRUE   
+?ELS31:        EQUAL?  PRSA,V?THROUGH \FALSE
+       ZERO?   FWEEPED /FALSE
+       PRINTR  "Your wingspan is too large."
+
+
+       .FUNCT  YIPPLES-F
+       EQUAL?  PRSA,V?TAKE \?ELS5
+       SET     'BITTEN,TRUE-VALUE
+       CALL    QUEUE,I-BITE-HEAL,20
+       PUT     STACK,0,1
+       PRINTR  "As you reach into the cannon, something bites you painfully on the hand!"
+?ELS5: EQUAL?  PRSA,V?EXAMINE \FALSE
+       PRINTR  "Every scroll is virtually identical."
+
+
+       .FUNCT  I-BITE-HEAL
+       SET     'BITTEN,FALSE-VALUE
+       RFALSE  
+
+       .ENDI
diff --git a/globals.zap b/globals.zap
new file mode 100644 (file)
index 0000000..b3abe6c
--- /dev/null
@@ -0,0 +1,1055 @@
+
+
+       .FUNCT  NOT-HERE-OBJECT-F,TBL,PRSO?=1,OBJ,X=0
+       EQUAL?  PRSO,NOT-HERE-OBJECT \?ELS3
+       EQUAL?  PRSI,NOT-HERE-OBJECT \?ELS3
+       PRINTR  "Those things aren't here!"
+?ELS3: EQUAL?  PRSO,NOT-HERE-OBJECT \?ELS9
+       SET     'TBL,P-PRSO
+       JUMP    ?CND1
+?ELS9: SET     'TBL,P-PRSI
+       SET     'PRSO?,FALSE-VALUE
+?CND1: ZERO?   PRSO? /?ELS14
+       EQUAL?  PRSA,V?FIND,V?FOLLOW,V?AIMFIZ /?THN19
+       EQUAL?  PRSA,V?WHAT,V?WHERE,V?WHO /?THN19
+       EQUAL?  PRSA,V?WAIT-FOR,V?SEND,V?WALK-TO /?THN19
+       EQUAL?  PRSA,V?RESEARCH \?CND12
+?THN19:        SET     'X,TRUE-VALUE
+       CALL    FIND-NOT-HERE,TBL,PRSO? >OBJ
+       ZERO?   OBJ /FALSE
+       EQUAL?  OBJ,NOT-HERE-OBJECT \TRUE
+       JUMP    ?CND12
+?ELS14:        EQUAL?  PRSA,V?AIMFIZ-TO \?ELS37
+       EQUAL?  PRSO,ME /?THN34
+?ELS37:        EQUAL?  PRSA,V?CAST \?CND12
+       EQUAL?  PRSO,AIMFIZ-SPELL \?CND12
+?THN34:        SET     'X,TRUE-VALUE
+       CALL    FIND-NOT-HERE,TBL,PRSO? >OBJ
+       ZERO?   OBJ /FALSE
+       EQUAL?  OBJ,NOT-HERE-OBJECT \TRUE
+?CND12:        ZERO?   X /?ELS50
+       PRINTI  "You'll have to be more specific, I'm afraid."
+       CRLF    
+       JUMP    ?CND48
+?ELS50:        EQUAL?  WINNER,PROTAGONIST \?ELS55
+       PRINTI  "You can't see "
+       EQUAL?  P-XNAM,W?BELBOZ,W?HELIST,W?KRILL /?CND58
+       EQUAL?  P-XNAM,W?FROBAR,W?JEEARR,W?FLATHE /?CND58
+       EQUAL?  P-XNAM,W?DUNCAN,W?ENTHAR,W?THOLL /?CND58
+       EQUAL?  P-XNAM,W?GURTH,W?MIZNIA,W?ACCARD /?CND58
+       EQUAL?  P-XNAM,W?BORPHE,W?ANTHAR,W?MITHIC /?CND58
+       EQUAL?  P-XNAM,W?GALEPA,W?MAREIL,W?THRIFF /?CND58
+       EQUAL?  P-XNAM,W?ORKAN,W?BARBEL,W?CHEVAU \?ELS60
+       JUMP    ?CND58
+?ELS60:        PRINTI  "any "
+?CND58:        CALL    NOT-HERE-PRINT,PRSO?
+       PRINTI  " here!"
+       CRLF    
+       JUMP    ?CND48
+?ELS55:        PRINTI  "Looking confused,"
+       CALL    ARTICLE,WINNER,TRUE-VALUE
+       PRINTI  " says, ""I don't see any "
+       CALL    NOT-HERE-PRINT,PRSO?
+       PRINTI  " here!"""
+       CRLF    
+?CND48:        SET     'P-CONT,FALSE-VALUE
+       SET     'QUOTE-FLAG,FALSE-VALUE
+       RTRUE   
+
+
+       .FUNCT  FIND-NOT-HERE,TBL,PRSO?,M-F,OBJ
+       CALL    MOBY-FIND,TBL >M-F
+       EQUAL?  1,M-F \?ELS5
+       ZERO?   PRSO? /?ELS8
+       SET     'PRSO,P-MOBY-FOUND
+       RFALSE  
+?ELS8: SET     'PRSI,P-MOBY-FOUND
+       RFALSE  
+?ELS5: ZERO?   PRSO? \?ELS13
+       PRINTI  "You wouldn't find any "
+       CALL    NOT-HERE-PRINT,PRSO?
+       PRINTR  " there."
+?ELS13:        RETURN  NOT-HERE-OBJECT
+
+
+       .FUNCT  NOT-HERE-PRINT,PRSO?,?TMP1
+       EQUAL?  P-XNAM,W?BELBOZ \?ELS5
+       PRINTI  "Belboz"
+       RTRUE   
+?ELS5: EQUAL?  P-XNAM,W?THOLL \?ELS9
+       PRINTI  "Tholl"
+       RTRUE   
+?ELS9: EQUAL?  P-XNAM,W?GURTH,W?MIZNIA,W?ACCARD /?THN14
+       EQUAL?  P-XNAM,W?BORPHE,W?ANTHAR,W?MITHIC /?THN14
+       EQUAL?  P-XNAM,W?GALEPA,W?MAREIL,W?THRIFF \?ELS13
+?THN14:        PRINTI  "that place"
+       RTRUE   
+?ELS13:        EQUAL?  P-XNAM,W?HELIST,W?FROBAR,W?ORKAN /?THN20
+       EQUAL?  P-XNAM,W?BARBEL,W?CHEVAU \?ELS19
+?THN20:        PRINTI  "that person"
+       RTRUE   
+?ELS19:        EQUAL?  P-XNAM,W?JEEARR \?ELS25
+       PRINTI  "Jeearr"
+       RTRUE   
+?ELS25:        EQUAL?  P-XNAM,W?KRILL \?ELS29
+       PRINTI  "Krill"
+       RTRUE   
+?ELS29:        EQUAL?  P-XNAM,W?FLATHE \?ELS33
+       PRINTI  "Flathead"
+       RTRUE   
+?ELS33:        EQUAL?  P-XNAM,W?DUNCAN,W?ENTHAR \?ELS37
+       PRINTI  "that King"
+       RTRUE   
+?ELS37:        ZERO?   P-OFLAG /?ELS41
+       ZERO?   P-XADJ /?CND43
+       PRINTB  P-XADJN
+?CND43:        ZERO?   P-XNAM /FALSE
+       PRINTB  P-XNAM
+       RTRUE   
+?ELS41:        ZERO?   PRSO? /?ELS54
+       GET     P-ITBL,P-NC1 >?TMP1
+       GET     P-ITBL,P-NC1L
+       CALL    BUFFER-PRINT,?TMP1,STACK,FALSE-VALUE
+       RSTACK  
+?ELS54:        GET     P-ITBL,P-NC2 >?TMP1
+       GET     P-ITBL,P-NC2L
+       CALL    BUFFER-PRINT,?TMP1,STACK,FALSE-VALUE
+       RSTACK  
+
+
+       .FUNCT  GROUND-F
+       EQUAL?  PRSA,V?CLIMB-FOO,V?CLIMB-ON,V?CLIMB-UP /?THN6
+       EQUAL?  PRSA,V?BOARD \?ELS5
+?THN6: CALL    V-SIT
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?EXAMINE \?ELS9
+       EQUAL?  HERE,LAGOON \?ELS9
+       PRINTR  "Through the water you can see sandy ground below."
+?ELS9: EQUAL?  PRSA,V?EXAMINE,V?LOOK-INSIDE,V?LOOK-UNDER \?ELS15
+       EQUAL?  HERE,GLASS-MAZE \?ELS15
+       CALL    PERFORM,V?EXAMINE,MAZE
+       RTRUE   
+?ELS15:        EQUAL?  PRSA,V?LOOK-UNDER \FALSE
+       PRINTR  "You've never mastered an X-ray vision spell."
+
+
+       .FUNCT  ROAD-F
+       EQUAL?  PRSA,V?FOLLOW \FALSE
+       CALL    V-WALK-AROUND
+       RSTACK  
+
+
+       .FUNCT  CORRIDOR-F
+       EQUAL?  PRSA,V?WALK-TO,V?THROUGH \FALSE
+       CALL    V-WALK-AROUND
+       RSTACK  
+
+
+       .FUNCT  WALLS-F
+       EQUAL?  PRSA,V?READ \?ELS5
+       EQUAL?  HERE,CHAMBER-OF-THE-CIRCLE \?ELS5
+       CALL    PERFORM,V?READ,TENETS
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?EXAMINE \?ELS9
+       EQUAL?  HERE,HALL-OF-CARVINGS \?ELS9
+       ZERO?   DRAGON-MOVED \?ELS9
+       PRINTR  "A dragon carving adorns the far wall."
+?ELS9: EQUAL?  HERE,SLIMY-ROOM \?ELS15
+       EQUAL?  PRSA,V?EXAMINE \?ELS15
+       PRINTR  "The walls are covered with moss and stuff."
+?ELS15:        EQUAL?  HERE,GLASS-MAZE \FALSE
+       EQUAL?  PRSA,V?LOOK-INSIDE,V?EXAMINE \FALSE
+       CALL    PERFORM,V?EXAMINE,MAZE
+       RTRUE   
+
+
+       .FUNCT  CEILING-F
+       EQUAL?  PRSA,V?EXAMINE \?ELS5
+       EQUAL?  HERE,SLANTED-ROOM \?ELS10
+       PRINTR  "The ceiling is slanted, making the room trapezoidal in shape."
+?ELS10:        EQUAL?  HERE,PIT-OF-BONES \?ELS14
+       PRINTR  "There's an opening in the ceiling."
+?ELS14:        EQUAL?  HERE,CHAMBER-OF-THE-CIRCLE \FALSE
+       PRINTR  "Other than its shape, there's nothing of interest."
+?ELS5: EQUAL?  HERE,GLASS-MAZE \?ELS22
+       EQUAL?  PRSA,V?LOOK-INSIDE,V?EXAMINE \?ELS22
+       CALL    PERFORM,V?EXAMINE,MAZE
+       RTRUE   
+?ELS22:        EQUAL?  PRSA,V?LOOK-UNDER \FALSE
+       CALL    PERFORM,V?LOOK
+       RTRUE   
+
+
+       .FUNCT  STAIRS-F
+       EQUAL?  PRSA,V?CLIMB-FOO,V?CLIMB-UP \?ELS5
+       CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?CLIMB-DOWN \FALSE
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+
+
+       .FUNCT  BAT-F
+       ZERO?   FWEEPED /?ELS5
+       EQUAL?  PRSO,BAT \?ELS11
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,ME,PRSI
+       RTRUE   
+?ELS11:        SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,ME
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?RESEARCH /?ELS15
+       CALL    YOU-CANT-SEE-ANY,STR?97
+       RSTACK  
+?ELS15:        PRINTR  "The entry about bats is long and uninteresting."
+
+
+       .FUNCT  ME-F,OLIT
+       EQUAL?  PRSA,V?TELL \?ELS5
+       PRINTI  "Talking to yourself is said to be a sign of impending mental collapse."
+       CRLF    
+       CALL    STOP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?LISTEN \?ELS9
+       PRINTR  "Yes?"
+?ELS9: EQUAL?  PRSA,V?ALARM \?ELS13
+       ZERO?   SLEEPING /?ELS18
+       PRINTI  "As you wake up, Frobar sticks his head in the door and invites you shopping. When you return late that evening, you find the Guild Hall sacked, and many fellow Enchanters slaughtered. Servants of evil, teeth smeared with blood, fall upon you as well. A menacing voice echoes about the room. ""Pathetic Enchanters ... Who can save you now?""
+
+Some days it just doesn't pay to wake up."
+       CALL    FINISH
+       RSTACK  
+?ELS18:        PRINTR  "You are obviously awake already."
+?ELS13:        EQUAL?  PRSA,V?RESEARCH \?ELS27
+       PRINTR  "You find several sentences mentioning your heroic defeat of the warlock Krill."
+?ELS27:        EQUAL?  PRSA,V?AIMFIZ \?ELS31
+       PRINTI  "You are suddenly "
+       ZERO?   FLYING /?ELS36
+       PRINTI  "floating"
+       JUMP    ?CND34
+?ELS36:        PRINTI  "standing"
+?CND34:        PRINTR  " right next to your former location! Wow!!"
+?ELS31:        EQUAL?  PRSA,V?VARDIK \?ELS47
+       SET     'VARDIKED,TRUE-VALUE
+       CALL    QUEUE,I-UNVARDIK,12
+       PUT     STACK,0,1
+       PRINTR  "A feeling of warmth and protection fills your mind."
+?ELS47:        EQUAL?  PRSA,V?YOMIN \?ELS51
+       PRINTR  "You sense a mind concentrating on casting the yomin spell."
+?ELS51:        EQUAL?  PRSA,V?GASPAR \?ELS55
+       SET     'RESURRECTION-ROOM,HERE
+       PRINTR  "A sense of peace of mind passes over you."
+?ELS55:        EQUAL?  PRSA,V?GOLMAC \?ELS59
+       ZERO?   GOLMACKED /?CND60
+       CALL    POOF
+?CND60:        SET     'GOLMACKED,TRUE-VALUE
+       FCLEAR  KEROSENE-LAMP,OPENBIT
+       MOVE    VARDIK-SCROLL,KEROSENE-LAMP
+       MOVE    GOLMAC-SCROLL,SLANTED-ROOM
+       FCLEAR  GOLMAC-SCROLL,ONBIT
+       MOVE    ROPE,SHAFT-BOTTOM
+       MOVE    BEAM,COAL-MINE-1
+       SET     'ROPE-PLACED,FALSE-VALUE
+       SET     'ROPE-TO-BEAM,FALSE-VALUE
+       SET     'CURRENT-SETTING,0
+       FCLEAR  ROPE,TOUCHBIT
+       FCLEAR  DIAL-DOOR,OPENBIT
+       SET     'DIAL-OPEN,FALSE-VALUE
+       PRINTI  "You are surrounded by a puff of smoke, and feel disoriented for a moment. When the smoke clears, nothing seems to have changed"
+       EQUAL?  HERE,SLANTED-ROOM \?CND66
+       PRINTI  ", except that the kerosene lamp is now closed"
+?CND66:        PRINTR  "."
+?ELS59:        EQUAL?  PRSA,V?LOWER-INTO \?ELS74
+       EQUAL?  PRSI,LOWER-CHUTE,UPPER-CHUTE \?ELS74
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS74:        EQUAL?  PRSA,V?EXAMINE \?ELS78
+       ZERO?   FWEEPED /?ELS83
+       PRINTR  "You're batty! (And a rather large one, at that.)"
+?ELS83:        FSET?   PROTAGONIST,ONBIT \FALSE
+       PRINTR  "You seem to have been frotzed."
+?ELS78:        EQUAL?  PRSA,V?FROTZ \?ELS92
+       FSET?   PROTAGONIST,ONBIT /?ELS92
+       ZERO?   SLEEPING /?ELS99
+       CALL    V-SWANZO
+       RSTACK  
+?ELS99:        SET     'OLIT,LIT
+       SET     'ALWAYS-LIT,TRUE-VALUE
+       FSET    ME,ONBIT
+       FSET    PROTAGONIST,ONBIT
+       FSET    YOUNGER-SELF,ONBIT
+       PRINTI  "You are bathed in a sickly yellow light, bright enough to read by."
+       CRLF    
+       CALL    LIT?,HERE >LIT
+       ZERO?   OLIT \TRUE
+       ZERO?   LIT /TRUE
+       CRLF    
+       CALL    V-LOOK
+       RTRUE   
+?ELS92:        EQUAL?  PRSA,V?GIVE \?ELS111
+       EQUAL?  PRSI,ME \?ELS111
+       CALL    HELD?,PRSO
+       ZERO?   STACK /?ELS118
+       PRINTR  "You already have it."
+?ELS118:       CALL    PERFORM,V?TAKE,PRSO
+       RTRUE   
+?ELS111:       EQUAL?  PRSA,V?ATTACK,V?MUNG,V?KILL \?ELS124
+       CALL    JIGS-UP,STR?98
+       RSTACK  
+?ELS124:       EQUAL?  PRSA,V?FIND \FALSE
+       PRINTR  "You're right here!"
+
+
+       .FUNCT  GRUE-F
+       EQUAL?  HERE,GRUE-LAIR \?CND1
+       CALL    THIS-IS-IT,MUTATED-GRUES
+?CND1: EQUAL?  PRSA,V?RAISE,V?RUB,V?EXAMINE /?THN9
+       EQUAL?  PRSA,V?TAKE,V?KICK,V?LOWER /?THN9
+       EQUAL?  PRSA,V?LOOK-UNDER \?ELS8
+?THN9: PRINTR  "You can't see any grue here (thankfully)."
+?ELS8: EQUAL?  PRSA,V?WHERE \?ELS14
+       PRINTR  "There is no grue here, but I'm sure there is at least one lurking in the darkness nearby. I'd stay near a light source if I were you!"
+?ELS14:        EQUAL?  PRSA,V?LISTEN \?ELS18
+       PRINTR  "It makes no sound but is always lurking in the darkness nearby."
+?ELS18:        EQUAL?  PRSA,V?FROTZ \?ELS22
+       EQUAL?  HERE,GRUE-LAIR \?ELS27
+       PRINTI  "There is a flash of light from nearby!"
+       CRLF    
+       ZERO?   LIT \?CND30
+       SET     'LIT,TRUE-VALUE
+       CALL    V-LOOK
+?CND30:        FSET    HERE,ONBIT
+       RTRUE   
+?ELS27:        ZERO?   LIT /?ELS34
+       PRINTR  "There aren't any grues here -- it's light!"
+?ELS34:        PRINTR  "There's a flash of light nearby, and you glimpse a horrible, multi-fanged creature, a look of sheer terror on its face. It charges away, gurgling in agony, tearing at its glowing fur."
+?ELS22:        EQUAL?  PRSA,V?RESEARCH \FALSE
+       CALL    PERFORM,V?RESEARCH,LOBBY
+       RTRUE   
+
+
+       .FUNCT  WATER-F
+       EQUAL?  PRSA,V?DRINK-FROM,V?DRINK \?ELS5
+       PRINTR  "It's dangerous to drink untested water!"
+?ELS5: EQUAL?  PRSA,V?LOOK-INSIDE \?ELS9
+       CALL    MAKE-OUT
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?FILL \?ELS11
+       FSET?   PRSO,VIALBIT \?ELS11
+       PRINTR  "A vial nymph appears to warn that water can destroy the delicate magic properties of potion vials. It wags a finger at you before vanishing."
+?ELS11:        EQUAL?  WATER,PRSI \?ELS17
+       EQUAL?  HERE,STAGNANT-POOL,HIDDEN-CAVE /?ELS17
+       CALL    WATER-IS-PRSI
+       RSTACK  
+?ELS17:        EQUAL?  HERE,COVE,LAGOON,LAGOON-FLOOR \?ELS21
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,LAGOON-OBJECT,PRSI
+       RTRUE   
+?ELS21:        EQUAL?  HERE,OCEAN-NORTH,OCEAN-SOUTH,MOUTH-OF-RIVER \?ELS23
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,OCEAN,PRSI
+       RTRUE   
+?ELS23:        EQUAL?  HERE,DRAWBRIDGE \?ELS25
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,MOAT,PRSI
+       RTRUE   
+?ELS25:        EQUAL?  HERE,RIVER-BANK \?ELS27
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,RIVER,PRSI
+       RTRUE   
+?ELS27:        EQUAL?  HERE,FLUME \?ELS29
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,FLUME-OBJECT,PRSI
+       RTRUE   
+?ELS29:        EQUAL?  HERE,STAGNANT-POOL \?ELS31
+       EQUAL?  PRSA,V?THROUGH \?ELS36
+       CALL    DO-WALK,P?NW
+       RSTACK  
+?ELS36:        EQUAL?  PRSA,V?PULVER \FALSE
+       CALL    JIGS-UP,STR?99
+       RSTACK  
+?ELS31:        EQUAL?  HERE,HIDDEN-CAVE \?ELS40
+       ZERO?   RIVER-EVAPORATED /?ELS45
+       CALL    YOU-CANT-SEE-ANY,STR?100
+       RSTACK  
+?ELS45:        EQUAL?  PRSA,V?PULVER \?ELS48
+       PRINTR  "The water recedes for a moment, then swirls back."
+?ELS48:        EQUAL?  PRSA,V?THROUGH \FALSE
+       CALL    DO-WALK,P?OUT
+       RSTACK  
+?ELS40:        EQUAL?  HERE,RIVER-BED,TOP-OF-FALLS,STAGNANT-POOL \FALSE
+       PRINTR  "Hardly enough water here to get a good pulveration going."
+
+
+       .FUNCT  WATER-IS-PRSI
+       EQUAL?  HERE,COVE,LAGOON,LAGOON-FLOOR \?ELS5
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,LAGOON-OBJECT
+       RTRUE   
+?ELS5: EQUAL?  HERE,OCEAN-NORTH,OCEAN-SOUTH,MOUTH-OF-RIVER \?ELS7
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,OCEAN
+       RTRUE   
+?ELS7: EQUAL?  HERE,DRAWBRIDGE \?ELS9
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,MOAT
+       RTRUE   
+?ELS9: EQUAL?  HERE,RIVER-BANK \?ELS11
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,RIVER
+       RTRUE   
+?ELS11:        EQUAL?  HERE,FLUME \FALSE
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,FLUME-OBJECT
+       RTRUE   
+
+
+       .FUNCT  SKY-F,EL
+       EQUAL?  PRSA,V?EXAMINE \FALSE
+       FSET?   HERE,INSIDEBIT \?ELS10
+       PRINTR  "That would be difficult from here."
+?ELS10:        EQUAL?  HERE,LAGOON-FLOOR \FALSE
+       PRINTR  "The sky is blurry but visible."
+
+
+       .FUNCT  BELBOZ-F
+       EQUAL?  PRSA,V?ASK-FOR,V?ASK-ABOUT,V?TELL /?THN6
+       EQUAL?  PRSA,V?GIVE \?ELS5
+?THN6: PRINTI  "Belboz is in some sort of trance."
+       CRLF    
+       CALL    STOP
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?WHO \?ELS11
+       PRINTR  "Belboz, your friend and mentor, is the head of the Circle of Enchanters. Recently, he has been acting oddly and seems to have been avoiding you."
+?ELS11:        EQUAL?  PRSA,V?ALARM \?ELS15
+       CALL    INT,I-BELBOZ-AWAKES
+       PUT     STACK,0,0
+       CALL    I-BELBOZ-AWAKES
+       RSTACK  
+?ELS15:        EQUAL?  PRSA,V?RESEARCH \?ELS17
+       PRINTR  "There is a small entry about Belboz, mentioning that he is the Guildmaster of the Accardi Chapter of the Guild of Enchanters, and has served three terms as kingdomwide Secretary of the Guild."
+?ELS17:        EQUAL?  PRSA,V?FIND,V?WHERE \?ELS21
+       IN?     BELBOZ,HERE /?ELS21
+       PRINTR  "You last saw Belboz a few days ago. You can't begin to guess where he is now."
+?ELS21:        EQUAL?  PRSA,V?GASPAR \?ELS27
+       SET     'BELBOZ-GASPARED,TRUE-VALUE
+       RFALSE  
+?ELS27:        EQUAL?  PRSA,V?AIMFIZ \?ELS29
+       CALL    AIMFIZ-BELBOZ-JEEARR
+       CALL    GOTO,TWISTED-FOREST
+       ADD     SCORE,20 >SCORE
+       CALL    INT,I-PARROT
+       PUT     STACK,0,0
+       CALL    QUEUE,I-HELLHOUND,-1
+       PUT     STACK,0,1
+       RTRUE   
+?ELS29:        EQUAL?  PRSA,V?YOMIN \?ELS31
+       PRINTR  "You get a horrifying glimpse of a monstrous creature intertwined throughout Belboz's mind. You concentrate, attempting to translate this image into visual terms, and imagine a giant spider with millions of legs, wrapped around and feasting upon the body and spirit of Belboz. The image fades, and you stagger backwards."
+?ELS31:        EQUAL?  PRSA,V?KILL \?ELS35
+       EQUAL?  PRSI,KNIFE \?ELS35
+       CALL    KILL-BELBOZ
+       RSTACK  
+?ELS35:        EQUAL?  PRSA,V?SWANZO \FALSE
+       CALL    SWANZO-BELBOZ
+       RSTACK  
+
+
+       .FUNCT  AIMFIZ-BELBOZ-JEEARR
+       PRINTI  "After a momentary dizziness, you realize that your location has changed, although "
+       PRINTD  PRSO
+       PRINTI  " is not in sight..."
+       CRLF    
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  GLOBAL-ROOM-F
+       EQUAL?  PRSA,V?LOOK-INSIDE,V?EXAMINE,V?LOOK \?ELS5
+       CALL    V-LOOK
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?EXIT,V?DROP,V?THROUGH \?ELS7
+       CALL    V-WALK-AROUND
+       RSTACK  
+?ELS7: EQUAL?  PRSA,V?WALK-AROUND \FALSE
+       PRINTR  "Walking around the room reveals nothing new. If you want to move elsewhere, simply indicate the desired direction."
+
+
+       .FUNCT  ARCHWAY-F
+       EQUAL?  PRSA,V?CROSS,V?THROUGH \?ELS5
+       CALL    V-WALK-AROUND
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?LOOK-INSIDE \FALSE
+       CALL    MAKE-OUT
+       RSTACK  
+
+
+       .FUNCT  HOLE-F
+       EQUAL?  HERE,HOLLOW \?ELS5
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       EQUAL?  HOLE,PRSO \?ELS10
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,BRICK-STRUCTURE,PRSI
+       RTRUE   
+?ELS10:        SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,BRICK-STRUCTURE
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?CLIMB-UP,V?CLIMB-FOO,V?THROUGH /?THN15
+       EQUAL?  PRSA,V?CLIMB-DOWN \?ELS14
+?THN15:        EQUAL?  HERE,FOREST-EDGE \?ELS21
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS21:        EQUAL?  HERE,SLIMY-ROOM \?ELS23
+       CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS23:        EQUAL?  HERE,HIDDEN-CAVE \?ELS25
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS25:        EQUAL?  HERE,PIT-OF-BONES \?ELS27
+       CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS27:        EQUAL?  HERE,DUNGEON \?ELS29
+       CALL    DO-WALK,P?DOWN
+       RSTACK  
+?ELS29:        EQUAL?  HERE,LOBBY \FALSE
+       CALL    V-WALK-AROUND
+       RSTACK  
+?ELS14:        EQUAL?  PRSA,V?LOOK-INSIDE \FALSE
+       CALL    MAKE-OUT
+       RSTACK  
+
+
+       .FUNCT  FOREST-F
+       EQUAL?  PRSA,V?MEEF \?ELS5
+       PRINTR  "You're too late -- this forest dried up eons ago."
+?ELS5: EQUAL?  PRSA,V?THROUGH \FALSE
+       EQUAL?  HERE,MINE-FIELD,FOREST-EDGE \?ELS14
+       CALL    DO-WALK,P?WEST
+       RSTACK  
+?ELS14:        EQUAL?  HERE,TWISTED-FOREST,TREE-BRANCH \?ELS16
+       CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS16:        CALL    CANT-ENTER,FOREST
+       RSTACK  
+
+
+       .FUNCT  CASTLE-F
+       EQUAL?  PRSA,V?RESEARCH \?ELS5
+       PRINTR  "Egreth was the castle of King Duncanthrax."
+?ELS5: EQUAL?  PRSA,V?THROUGH \FALSE
+       EQUAL?  HERE,DRAWBRIDGE,RUINS \?ELS14
+       CALL    DO-WALK,P?EAST
+       RSTACK  
+?ELS14:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+
+
+       .FUNCT  CAVE-F
+       EQUAL?  PRSA,V?THROUGH \?ELS5
+       EQUAL?  HERE,MOUTH-OF-RIVER,GRUE-LAIR \?ELS10
+       CALL    DO-WALK,P?WEST
+       RSTACK  
+?ELS10:        EQUAL?  HERE,RIVER-BED \?ELS12
+       CALL    DO-WALK,P?NE
+       RSTACK  
+?ELS12:        EQUAL?  HERE,PIT-OF-BONES \?ELS14
+       CALL    DO-WALK,P?UP
+       RSTACK  
+?ELS14:        EQUAL?  HERE,BELBOZ-HIDEOUT \?ELS16
+       CALL    DO-WALK,P?EAST
+       RSTACK  
+?ELS16:        CALL    LOOK-AROUND-YOU
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?LOOK-INSIDE \FALSE
+       CALL    MAKE-OUT
+       RSTACK  
+
+
+       .FUNCT  HELISTAR-F
+       EQUAL?  PRSA,V?WHO \?ELS5
+       PRINTR  "Helistar is an old and powerful member of the Circle. Although a skilled and experienced magic-user, she is humorless to the point of being grim. Despite this personality flaw, Helistar is the most likely candidate to become the next Guildmaster of the Circle."
+?ELS5: EQUAL?  PRSA,V?WHERE \?ELS9
+       PRINTR  "Helistar has gone on her annual two-week vacation. She usually goes to the southlands, Gurth and Mithicus."
+?ELS9: EQUAL?  PRSA,V?AIMFIZ \FALSE
+       CALL    AIMFIZ-LOSE
+       CALL    PICK-ONE,HELISTARISMS
+       PRINT   STACK
+       CALL    JIGS-UP,STR?71
+       RSTACK  
+
+
+       .FUNCT  FROBAR-F
+       EQUAL?  PRSA,V?WHO \?ELS5
+       PRINTR  "Frobar is the most loyal and hard-working member of the Guild. However, he is somewhat dull and lacks imagination. It is doubtful that he would ever succeed Belboz as head of the Circle."
+?ELS5: EQUAL?  PRSA,V?WHERE \?ELS9
+       PRINTR  "Perhaps he's gone into town to perform some errands."
+?ELS9: EQUAL?  PRSA,V?AIMFIZ \FALSE
+       CALL    AIMFIZ-LOSE
+       CALL    PICK-ONE,FROBARISMS
+       PRINT   STACK
+       CALL    JIGS-UP,STR?71
+       RSTACK  
+
+
+       .FUNCT  AIMFIZ-LOSE
+       PRINTI  "When you recover from a brief dizziness, you notice "
+       PRINTD  PRSO
+       PRINTI  " nearby, looking surprised to see you. A moment later, you realize that "
+       PRINTD  PRSO
+       PRINTI  " is "
+       RTRUE   
+
+
+       .FUNCT  IMPLEMENTOR-F
+       EQUAL?  PRSA,V?AIMFIZ \?ELS5
+       CALL    JIGS-UP,STR?108
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?RESEARCH \FALSE
+       PRINTR  "Possibly the largest entry in the volume, detailing the facts and the myths about the man known as the Bearded Oracle of Yonkers."
+
+
+       .FUNCT  JEEARR-F
+       EQUAL?  PRSA,V?RESEARCH \?ELS5
+       PRINTR  "There's a long write-up in the mythology section. The evil force called Jeearr once spread pestilence and terror across many lands. Only the combined magic of many kings and wizards stopped him, even as he was preparing his final assault. He was imprisoned in the void beyond our world, his jailors warning future generations that his exile might not be permanent."
+?ELS5: EQUAL?  PRSA,V?SWANZO \?ELS9
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,BELBOZ
+       RTRUE   
+?ELS9: EQUAL?  PRSA,V?AIMFIZ \FALSE
+       CALL    AIMFIZ-BELBOZ-JEEARR
+       CALL    GOTO,TWISTED-FOREST
+       ADD     SCORE,20 >SCORE
+       CALL    INT,I-PARROT
+       PUT     STACK,0,0
+       CALL    QUEUE,I-HELLHOUND,-1
+       PUT     STACK,0,1
+       RTRUE   
+
+
+       .FUNCT  SPELL-BOOK-F,F
+       FIRST?  SPELL-BOOK >F /?KLU41
+?KLU41:        EQUAL?  PRSA,V?EXAMINE \?ELS5
+       PRINTI  "This is the spell book given to you by Belboz after your original book was lost during your battle with Krill. "
+       FSET?   SPELL-BOOK,MUNGBIT \?ELS12
+       CALL    BOOK-DAMP
+       RSTACK  
+?ELS12:        PRINTR  "There are several spells written in the book, with marginal notes about their effects and how to cast them."
+?ELS5: EQUAL?  PRSA,V?CLOSE,V?OPEN \?ELS18
+       PRINTR  "Thanks to its magic properties, the spell book is always open to the right place at the right time, but it is also always closed. This innovation eliminates tedious leafing and hunting for spells in tight situations. Many wizardly lives have been saved by this advance in magical technology."
+?ELS18:        EQUAL?  PRSA,V?LOOK-INSIDE,V?READ \FALSE
+       FSET?   SPELL-BOOK,MUNGBIT \?ELS25
+       CALL    BOOK-DAMP
+       RTRUE   
+?ELS25:        ZERO?   LIT \?CND23
+       ZERO?   BLORTED \?CND23
+       PRINTI  "Though it is dark, the magic writing of your spells casts enough light that you can read them."
+       CRLF    
+?CND23:        CRLF    
+       PRINTI  "My Spell Book"
+       CRLF    
+       CRLF    
+?PRG34:        ZERO?   F /TRUE
+       PRINTI  "The "
+       PRINTD  F
+       PRINTI  " ("
+       GETP    F,P?TEXT
+       PRINT   STACK
+       PRINTI  ")."
+       CRLF    
+       NEXT?   F >F /?KLU42
+?KLU42:        JUMP    ?PRG34
+
+
+       .FUNCT  I-FLY
+       SET     'FLYING,FALSE-VALUE
+       CRLF    
+       EQUAL?  HERE,GLASS-MAZE \?ELS3
+       CALL    NO-FLOOR?
+       ZERO?   STACK /?ELS3
+       CALL    JIGS-UP,STR?114
+       JUMP    ?CND1
+?ELS3: EQUAL?  HERE,TREE-BRANCH \?ELS7
+       CALL    SETTLE-ONTO-BRANCH
+       JUMP    ?CND1
+?ELS7: EQUAL?  HERE,LAGOON \?ELS9
+       CALL    SPLASH-INTO-WATER
+       JUMP    ?CND1
+?ELS9: PRINTI  "You settle gently to the ground."
+       CRLF    
+?CND1: GRTR?   AWAKE,8 \FALSE
+       CALL    I-TIRED
+       RSTACK  
+
+
+       .FUNCT  SCROLL-F,SPELL
+       EQUAL?  PRSA,V?TAKE \?ELS5
+       FIRST?  PRSO >SPELL /?KLU37
+?KLU37:        FSET    SPELL,TOUCHBIT
+       FCLEAR  PRSO,TRYTAKEBIT
+       EQUAL?  PRSO,SWANZO-SCROLL \?ELS8
+       ZERO?   MAZE-CROSSED \?ELS8
+       FSET    PRSO,TOUCHBIT
+       SET     'MAZE-CROSSED,TRUE-VALUE
+       CALL    REARRANGE-MAZE-TABLE
+       MOVE    PRSO,PROTAGONIST
+       PRINTR  "As you take the scroll, a deep and evil laugh rumbles around the hollow. You hear a sliding, grinding noise and turn just in time to catch a flicker of light from within the glass maze, indicating that its transparent panels have shifted around."
+?ELS8: EQUAL?  PRSO,FWEEP-SCROLL \FALSE
+       FCLEAR  PRSO,TRYTAKEBIT
+       FCLEAR  BAT-GUANO,NDESCBIT
+       RFALSE  
+?ELS5: FIRST?  PRSO /?ELS16
+       FIRST?  PRSI /?ELS16
+       PRINTR  "Bug #72"
+?ELS16:        EQUAL?  PRSA,V?GNUSTO \?ELS22
+       FIRST?  PRSO >SPELL /?KLU38
+?KLU38:        CALL    PERFORM,V?GNUSTO,SPELL
+       RTRUE   
+?ELS22:        EQUAL?  PRSA,V?READ,V?EXAMINE \FALSE
+       FSET?   PRSO,MUNGBIT \?CND25
+       PRINTR  "The scroll is wet and the spell illegible."
+?CND25:        FIRST?  PRSO >SPELL /?KLU39
+?KLU39:        PRINTI  "The scroll reads """
+       PRINTD  SPELL
+       PRINTI  ": "
+       GETP    SPELL,P?TEXT
+       PRINT   STACK
+       PRINTI  """."
+       EQUAL?  SPELL,AIMFIZ-SPELL,YONK-SPELL \?CND32
+       PRINTI  " The spell seems very long and extremely complicated."
+?CND32:        CRLF    
+       RTRUE   
+
+
+       .FUNCT  ALWAYS-MEMORIZED,SPELL
+       EQUAL?  SPELL,GNUSTO-SPELL,FROTZ-SPELL,REZROV-SPELL \FALSE
+       RTRUE   
+
+
+       .FUNCT  SPELL-F,MEM?,FORGET=0
+       EQUAL?  PRSA,V?RESEARCH \?ELS5
+       PRINTI  "A spell produced by "
+       CALL    PICK-ONE,MANUFACTURERS
+       PRINT   STACK
+       PRINTR  "."
+?ELS5: EQUAL?  PRSA,V?READ \?ELS9
+       IN?     PRSO,SPELL-BOOK /?ELS14
+       LOC     PRSO
+       IN?     STACK,PROTAGONIST /?ELS14
+       PRINTR  "You can't do that without having the spell in your book or on a scroll in your hand."
+?ELS14:        LOC     PRSO
+       FSET?   STACK,MUNGBIT \?ELS20
+       CALL    PERFORM,V?READ,SPELL-BOOK
+       CALL    THIS-IS-IT,PRSO
+       RTRUE   
+?ELS20:        PRINTI  "The spell reads """
+       GETP    PRSO,P?TEXT
+       PRINT   STACK
+       PRINTR  """."
+?ELS9: EQUAL?  PRSA,V?LEARN \?ELS30
+       CALL    ALWAYS-MEMORIZED,PRSO
+       ZERO?   STACK /?ELS35
+       PRINTR  "You already know that spell by heart."
+?ELS35:        IN?     PRSO,SPELL-BOOK /?ELS39
+       LOC     PRSO
+       IN?     STACK,PROTAGONIST \?ELS44
+       PRINTR  "You can't memorize a spell until you've written it into your spell book."
+?ELS44:        CALL    V-LEARN
+       RSTACK  
+?ELS39:        IN?     SPELL-BOOK,PROTAGONIST /?ELS50
+       PRINTR  "You don't have your spell book. How do you expect to learn a spell without a spell book?"
+?ELS50:        ZERO?   LIT \?ELS54
+       ZERO?   BLORTED \?ELS54
+       PRINTR  "You can't learn it in the dark."
+?ELS54:        FSET?   SPELL-BOOK,MUNGBIT \?ELS60
+       CALL    PERFORM,V?READ,SPELL-BOOK
+       CALL    THIS-IS-IT,PRSO
+       RTRUE   
+?ELS60:        GETP    PRSO,P?COUNT >MEM?
+       ZERO?   SPELL-ROOM \?ELS65
+       EQUAL?  SPELL-MAX,1 \?ELS68
+       PRINTR  "You can't concentrate well enough to learn the spell."
+?ELS68:        EQUAL?  MEM?,SPELL-MAX \?ELS72
+       PRINTR  "You try and try, but you just can't memorize those complex syllables again. They slip playfully out of your memory as soon as you cram them in."
+?ELS72:        CALL    FORGET-SPELL,PRSO
+       INC     'MEM?
+       PUTP    PRSO,P?COUNT,MEM?
+       SET     'FORGET,TRUE-VALUE
+       JUMP    ?CND63
+?ELS65:        DEC     'SPELL-ROOM
+       INC     'MEM?
+       PUTP    PRSO,P?COUNT,MEM?
+?CND63:        PRINTI  "Using your best study habits, you learn the "
+       PRINTD  PRSO
+       GRTR?   MEM?,1 \?CND81
+       PRINTI  " yet another time"
+?CND81:        PRINTI  "."
+       CRLF    
+       ZERO?   FORGET /TRUE
+       PRINTR  "You have so much buzzing around in your head, though, that it's likely that something may have been forgotten in the shuffle."
+?ELS30:        CALL    VISIBLE?,PRSO
+       ZERO?   STACK \?ELS95
+       EQUAL?  PRSA,V?CAST /?ELS95
+       PRINTR  "You can't see that spell here!"
+?ELS95:        EQUAL?  PRSA,V?THROW,V?DROP,V?TAKE \FALSE
+       CALL    PICK-ONE,YUKS
+       PRINT   STACK
+       CRLF    
+       RTRUE   
+
+
+       .FUNCT  FORGET-SPELL,SPL,NSPL,F,CNT,TBL,NUM=0,SP=0
+       FIRST?  SPELL-BOOK >F /?KLU26
+?KLU26:        SET     'TBL,FORGET-TBL
+?PRG1: ZERO?   F \?ELS5
+       JUMP    ?REP2
+?ELS5: GETP    F,P?COUNT >CNT
+       GRTR?   CNT,0 \?CND3
+?PRG8: SET     'SP,F
+       PUT     TBL,1,F
+       INC     'NUM
+       ADD     TBL,2 >TBL
+       DLESS?  'CNT,1 \?PRG8
+?CND3: NEXT?   F >F /?KLU27
+?KLU27:        JUMP    ?PRG1
+?REP2: GRTR?   NUM,0 \?CND13
+       GETP    SP,P?COUNT
+       EQUAL?  STACK,NUM \?CND13
+       SUB     NUM,1
+       PUTP    SP,P?COUNT,STACK
+       RTRUE   
+?CND13:        PUT     FORGET-TBL,0,NUM
+       ZERO?   NUM /TRUE
+?PRG21:        CALL    PICK-ONE,FORGET-TBL >NSPL
+       EQUAL?  NSPL,SPL /?PRG21
+       GETP    NSPL,P?COUNT
+       SUB     STACK,1
+       PUTP    NSPL,P?COUNT,STACK
+       RTRUE   
+
+
+       .FUNCT  FORGET-ALL,F
+       SET     'SPELL-ROOM,SPELL-MAX
+       FIRST?  SPELL-BOOK >F /?KLU8
+?KLU8: 
+?PRG1: ZERO?   F /TRUE
+       PUTP    F,P?COUNT,0
+       NEXT?   F >F /?KLU9
+?KLU9: JUMP    ?PRG1
+
+
+       .FUNCT  WEAR-OFF-SPELLS
+       SET     'UNDER-INFLUENCE,FALSE-VALUE
+       SET     'FLYING,FALSE-VALUE
+       SET     'FWEEPED,FALSE-VALUE
+       SET     'VARDIKED,FALSE-VALUE
+       SET     'VILSTUED,FALSE-VALUE
+       SET     'BLORTED,FALSE-VALUE
+       SET     'FOOBLED,FALSE-VALUE
+       CALL    INT,I-FLY
+       PUT     STACK,0,0
+       CALL    INT,I-UNFWEEP
+       PUT     STACK,0,0
+       CALL    INT,I-UNVARDIK
+       PUT     STACK,0,0
+       CALL    INT,I-BREATHE
+       PUT     STACK,0,0
+       CALL    INT,I-UNBLORT
+       PUT     STACK,0,0
+       CALL    INT,I-UNFOOBLE
+       PUT     STACK,0,0
+       SET     'GNOME-SLEEPING,TRUE-VALUE
+       CALL    INT,I-GNOME
+       PUT     STACK,0,0
+       MOVE    PARK-GNOME,DIAL
+       CALL    INT,I-PARK-GNOME
+       PUT     STACK,0,0
+       RTRUE   
+
+
+       .FUNCT  READ-ABOUT-POTIONS,NUM,MAKER
+       GET     POTION-MAKERS,NUM >MAKER
+       PRINTI  "A potion made by "
+       PRINT   MAKER
+       PRINTR  "."
+
+
+       .FUNCT  POTION-POUR,VIAL
+       CALL    HELD?,VIAL
+       ZERO?   STACK \?CND1
+       CALL    THIS-IS-IT,VIAL
+       PRINT   YNH
+       CALL    ARTICLE,VIAL,TRUE-VALUE
+       PRINTR  "."
+?CND1: MOVE    PRSO,DIAL
+       PRINTI  "The potion evaporates before it even reaches"
+       ZERO?   PRSI /?ELS14
+       CALL    ARTICLE,PRSI,TRUE-VALUE
+       PRINTR  "."
+?ELS14:        PRINTR  " the ground."
+
+
+       .FUNCT  TWO-POTIONS
+       PRINTI  "Uh oh. The "
+       PRINTD  PRSO
+       PRINTI  " seems to be having an unpleasant reaction with the "
+       PRINTD  UNDER-INFLUENCE
+       PRINTI  ". "
+       CALL    PICK-ONE,POTION-REACTIONS
+       PRINT   STACK
+       CALL    JIGS-UP,STR?71
+       RSTACK  
+
+
+       .FUNCT  GLOBAL-SLEEP-F
+       EQUAL?  PRSA,V?TAKE,V?WALK-TO \?ELS5
+       IN?     PROTAGONIST,YOUR-QUARTERS \?CND6
+       MOVE    PROTAGONIST,BED
+?CND6: CALL    PERFORM,V?SLEEP
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?FIND \FALSE
+       PRINTR  "Sleep anywhere."
+
+
+       .FUNCT  I-TIRED,FORG=0
+       IN?     PROTAGONIST,BED \?CND1
+       CRLF    
+       PRINTI  "The bed is comfortable and you are becoming tired."
+       CRLF    
+       INC     'AWAKE
+       CALL    V-SLEEP,TRUE-VALUE
+       RETURN  2
+?CND1: GRTR?   LOAD-ALLOWED,10 \?CND8
+       SUB     LOAD-ALLOWED,10 >LOAD-ALLOWED
+?CND8: GRTR?   FUMBLE-NUMBER,1 \?CND11
+       DEC     'FUMBLE-NUMBER
+?CND11:        GRTR?   SPELL-MAX,1 \?CND14
+       DEC     'SPELL-MAX
+       ZERO?   SPELL-ROOM /?CND17
+       DEC     'SPELL-ROOM
+?CND17:        ZERO?   SPELL-ROOM \?CND14
+       SET     'FORG,TRUE-VALUE
+?CND14:        CALL    QUEUE,I-TIRED,8
+       PUT     STACK,0,1
+       INC     'AWAKE
+       GRTR?   AWAKE,8 \?ELS27
+       ZERO?   FLYING /?CND28
+       CALL    QUEUE,I-TIRED,14
+       PUT     STACK,0,1
+       RFALSE  
+?CND28:        CRLF    
+       PRINTI  "You drop in your tracks from exhaustion."
+       CRLF    
+       CRLF    
+       CALL    V-SLEEP
+       RETURN  2
+?ELS27:        CRLF    
+       PRINTI  "You are "
+       GET     TIRED-TELL,AWAKE
+       PRINT   STACK
+       ZERO?   FORG /?CND40
+       PRINTI  " and the spells you've memorized are becoming confused"
+?CND40:        PRINTR  "."
+
+
+       .FUNCT  I-HUNGER
+       ZERO?   BERZIOED /?ELS5
+       SET     'HUNGER-LEVEL,0
+       RANDOM  80
+       ADD     580,STACK
+       CALL    QUEUE,I-HUNGER,STACK
+       PUT     STACK,0,1
+       RFALSE  
+?ELS5: EQUAL?  HUNGER-LEVEL,6 \?ELS8
+       SET     'THIRST-LEVEL,6
+       CALL    I-THIRST
+       RSTACK  
+?ELS8: CALL    QUEUE,I-HUNGER,11
+       PUT     STACK,0,1
+       CALL    HUNGER-THIRST-WARNING,HUNGER-LEVEL,TRUE-VALUE
+       INC     'HUNGER-LEVEL
+       RETURN  HUNGER-LEVEL
+
+
+       .FUNCT  I-THIRST
+       ZERO?   BERZIOED /?ELS5
+       SET     'THIRST-LEVEL,0
+       RANDOM  100
+       ADD     540,STACK
+       CALL    QUEUE,I-THIRST,STACK
+       PUT     STACK,0,1
+       RFALSE  
+?ELS5: EQUAL?  THIRST-LEVEL,6 \?ELS8
+       CRLF    
+       CALL    JIGS-UP,STR?136,TRUE-VALUE
+       RSTACK  
+?ELS8: CALL    QUEUE,I-THIRST,9
+       PUT     STACK,0,1
+       CALL    HUNGER-THIRST-WARNING,THIRST-LEVEL
+       INC     'THIRST-LEVEL
+       RETURN  THIRST-LEVEL
+
+
+       .FUNCT  HUNGER-THIRST-WARNING,LEVEL,HUNGRY=0
+       CRLF    
+       PRINTI  "You are now "
+       GET     HUNGER-THIRST-TABLE,LEVEL
+       PRINT   STACK
+       ZERO?   HUNGRY /?ELS5
+       PRINTI  " hungry"
+       JUMP    ?CND3
+?ELS5: PRINTI  " thirsty"
+?CND3: PRINTR  "."
+
+
+       .FUNCT  SPELL-CHECK,TBL,WRD,OBJ=0
+       EQUAL?  WRD,W?GNUSTO \?ELS3
+       SET     'OBJ,GNUSTO-SPELL
+       JUMP    ?CND1
+?ELS3: EQUAL?  WRD,W?FROTZ \?ELS5
+       SET     'OBJ,FROTZ-SPELL
+       JUMP    ?CND1
+?ELS5: EQUAL?  WRD,W?REZROV \?ELS7
+       SET     'OBJ,REZROV-SPELL
+       JUMP    ?CND1
+?ELS7: EQUAL?  WRD,W?IZYUK \?ELS9
+       SET     'OBJ,IZYUK-SPELL
+       JUMP    ?CND1
+?ELS9: EQUAL?  WRD,W?AIMFIZ \?ELS11
+       SET     'OBJ,AIMFIZ-SPELL
+       JUMP    ?CND1
+?ELS11:        EQUAL?  WRD,W?FWEEP \?ELS13
+       SET     'OBJ,FWEEP-SPELL
+       JUMP    ?CND1
+?ELS13:        EQUAL?  WRD,W?SWANZO \?ELS15
+       SET     'OBJ,SWANZO-SPELL
+       JUMP    ?CND1
+?ELS15:        EQUAL?  WRD,W?GOLMAC \?ELS17
+       SET     'OBJ,GOLMAC-SPELL
+       JUMP    ?CND1
+?ELS17:        EQUAL?  WRD,W?VARDIK \?ELS19
+       SET     'OBJ,VARDIK-SPELL
+       JUMP    ?CND1
+?ELS19:        EQUAL?  WRD,W?PULVER \?ELS21
+       SET     'OBJ,PULVER-SPELL
+       JUMP    ?CND1
+?ELS21:        EQUAL?  WRD,W?MEEF \?ELS23
+       SET     'OBJ,MEEF-SPELL
+       JUMP    ?CND1
+?ELS23:        EQUAL?  WRD,W?VEZZA \?ELS25
+       SET     'OBJ,VEZZA-SPELL
+       JUMP    ?CND1
+?ELS25:        EQUAL?  WRD,W?GASPAR \?ELS27
+       SET     'OBJ,GASPAR-SPELL
+       JUMP    ?CND1
+?ELS27:        EQUAL?  WRD,W?YOMIN \?ELS29
+       SET     'OBJ,YOMIN-SPELL
+       JUMP    ?CND1
+?ELS29:        EQUAL?  WRD,W?YONK \?ELS31
+       SET     'OBJ,YONK-SPELL
+       JUMP    ?CND1
+?ELS31:        EQUAL?  WRD,W?MALYON \?CND1
+       SET     'OBJ,MALYON-SPELL
+?CND1: ZERO?   OBJ /TRUE
+       CALL    OBJ-FOUND,OBJ,TBL
+       RTRUE   
+
+       .ENDI
index e508ecc7e95d009e69cb05e24a7f7be4e4a595f8..454a265c46365a91a7d08364a975f1c9ffd0806c 100644 (file)
         <COND (.X
                <TELL "You'll have to be more specific, I'm afraid." CR>)
               (<EQUAL? ,WINNER ,PROTAGONIST>
-               <TELL "You can't see">
+               <TELL "You can't see ">
                <COND (<OR <EQUAL? ,P-XNAM ,W?BELBOZ ,W?HELIST ,W?KRILL>
                           <EQUAL? ,P-XNAM ,W?FROBAR ,W?JEEARR ,W?FLATHE>
                           <EQUAL? ,P-XNAM ,W?DUNCAN ,W?ENTHAR ,W?THOLL>
                           <EQUAL? ,P-XNAM ,W?ORKAN ,W?BARBEL ,W?CHEVAU>>
                       T)
                      (T
-                      <TELL " any">)> 
+                      <TELL "any ">)> 
                <NOT-HERE-PRINT .PRSO?>
                <TELL " here!" CR>)
               (T
                <TELL "Looking confused,">
                <ARTICLE ,WINNER T>
-               <TELL " says, \"I don't see any">
+               <TELL " says, \"I don't see any ">
                <NOT-HERE-PRINT .PRSO?>
                <TELL " here!\"" CR>)>
         <SETG P-CONT <>>
                      <SETG PRSI ,P-MOBY-FOUND>)>
               <RFALSE>)
              (<NOT .PRSO?>
-              <TELL "You wouldn't find any">
+              <TELL "You wouldn't find any ">
               <NOT-HERE-PRINT .PRSO?>
               <TELL " there." CR>
               <RTRUE>)
 
 <ROUTINE NOT-HERE-PRINT (PRSO?)
         <COND (<EQUAL? ,P-XNAM ,W?BELBOZ>
-               <TELL " Belboz">)
+               <TELL "Belboz">)
               (<EQUAL? ,P-XNAM ,W?THOLL>
-               <TELL " Tholl">)
+               <TELL "Tholl">)
               (<OR <EQUAL? ,P-XNAM ,W?GURTH ,W?MIZNIA ,W?ACCARD>
                    <EQUAL? ,P-XNAM ,W?BORPHE ,W?ANTHAR ,W?MITHIC>
                    <EQUAL? ,P-XNAM ,W?GALEPA ,W?MAREIL ,W?THRIFF>>
-               <TELL " that place">)
+               <TELL "that place">)
               (<OR <EQUAL? ,P-XNAM ,W?HELIST ,W?FROBAR ,W?ORKAN>
                    <EQUAL? ,P-XNAM ,W?BARBEL ,W?CHEVAU>>
-               <TELL " that person">)
+               <TELL "that person">)
               (<EQUAL? ,P-XNAM ,W?JEEARR>
-               <TELL " Jeearr">)
+               <TELL "Jeearr">)
               (<EQUAL? ,P-XNAM ,W?KRILL>
-               <TELL " Krill">)
+               <TELL "Krill">)
               (<EQUAL? ,P-XNAM ,W?FLATHE>
-               <TELL " Flathead">)
+               <TELL "Flathead">)
               (<EQUAL? ,P-XNAM ,W?DUNCAN ,W?ENTHAR>
-               <TELL " that King">)
+               <TELL "that King">)
               (,P-OFLAG
-               <COND (,P-XADJ <TELL " "> <PRINTB ,P-XADJN>)>
-               <COND (,P-XNAM <TELL " "> <PRINTB ,P-XNAM>)>)
+               <COND (,P-XADJ <PRINTB ,P-XADJN>)>
+               <COND (,P-XNAM <PRINTB ,P-XNAM>)>)
                (.PRSO?
                <BUFFER-PRINT <GET ,P-ITBL ,P-NC1> <GET ,P-ITBL ,P-NC1L> <>>)
                (T
@@ -1084,6 +1084,12 @@ have shifted around." CR>
 " The spell seems very long and extremely complicated.">)>
                <CRLF>)>>
 
+<ROUTINE ALWAYS-MEMORIZED (SPELL)
+        <COND (<EQUAL? .SPELL ,GNUSTO-SPELL ,FROTZ-SPELL ,REZROV-SPELL>
+               <RTRUE>)
+              (T
+               <RFALSE>)>>
+
 <ROUTINE SPELL-F ("AUX" MEM? (FORGET <>))
         <COND (<VERB? RESEARCH>
                <TELL "A spell produced by " <PICK-ONE ,MANUFACTURERS> "." CR>)
@@ -1102,23 +1108,21 @@ a scroll in your hand." CR>)
                       <TELL <GETP ,PRSO ,P?TEXT>>
                       <TELL "\"." CR>)>)
               (<VERB? LEARN>
-               <COND (<NOT <IN? ,PRSO ,SPELL-BOOK>>
+               <COND (<ALWAYS-MEMORIZED ,PRSO>
+                      <TELL "You already know that spell by heart." CR>)
+                     (<NOT <IN? ,PRSO ,SPELL-BOOK>>
                       <COND (<IN? <LOC ,PRSO> ,PROTAGONIST>
                              <TELL
-"You haven't written that spell into your book yet. Until you do, you
-can't memorize the spell." CR>)
+"You can't memorize a spell until you've written it into your spell book." CR>)
                             (T
-                             <V-LEARN>)>)                    
-                     (<EQUAL? ,PRSO ,GNUSTO-SPELL ,FROTZ-SPELL ,REZROV-SPELL>
-                      <TELL "You already know that spell by heart." CR>)
+                             <V-LEARN>)>)
                      (<NOT <IN? ,SPELL-BOOK ,PROTAGONIST>>
                       <TELL
-"You don't have your spell book. How do you expect to memorize a spell
-without a spell book?" CR>)
+"You don't have your spell book. How do you expect to learn
+a spell without a spell book?" CR>)
                      (<AND <NOT ,LIT>
-                          <NOT ,BLORTED>>
-                      <TELL
-"It will be hard to learn that spell in the dark." CR>)
+                           <NOT ,BLORTED>>
+                      <TELL "You can't learn it in the dark." CR>)
                      (<FSET? ,SPELL-BOOK ,MUNGBIT>
                       <PERFORM ,V?READ ,SPELL-BOOK>
                       <THIS-IS-IT ,PRSO>
@@ -1179,7 +1183,8 @@ likely that something may have been forgotten in the shuffle." CR>)>
                <PUTP .SP ,P?COUNT <- .NUM 1>>
                <RTRUE>)>
         <PUT ,FORGET-TBL 0 .NUM>
-        <COND (<0? .NUM> <RTRUE>)>
+        <COND (<0? .NUM>
+               <RTRUE>)>
         <REPEAT ()
                 <COND (<NOT <EQUAL? <SET NSPL
                                          <PICK-ONE ,FORGET-TBL>>
@@ -1405,4 +1410,41 @@ bellowing and splashing, and twitching their ears.">>
         "very"
         "extremely"
         "incredibly"
-        "dangerously">>
\ No newline at end of file
+        "dangerously">>
+
+<ROUTINE SPELL-CHECK (TBL WRD "AUX" (OBJ <>))
+        <COND (<EQUAL? .WRD ,W?GNUSTO>
+               <SET OBJ ,GNUSTO-SPELL>)
+              (<EQUAL? .WRD ,W?FROTZ>
+               <SET OBJ ,FROTZ-SPELL>)
+              (<EQUAL? .WRD ,W?REZROV>
+               <SET OBJ ,REZROV-SPELL>)
+              (<EQUAL? .WRD ,W?IZYUK>
+               <SET OBJ ,IZYUK-SPELL>)
+              (<EQUAL? .WRD ,W?AIMFIZ>
+               <SET OBJ ,AIMFIZ-SPELL>)
+              (<EQUAL? .WRD ,W?FWEEP>
+               <SET OBJ ,FWEEP-SPELL>)
+              (<EQUAL? .WRD ,W?SWANZO>
+               <SET OBJ ,SWANZO-SPELL>)
+              (<EQUAL? .WRD ,W?GOLMAC>
+               <SET OBJ ,GOLMAC-SPELL>)
+              (<EQUAL? .WRD ,W?VARDIK>
+               <SET OBJ ,VARDIK-SPELL>)
+              (<EQUAL? .WRD ,W?PULVER>
+               <SET OBJ ,PULVER-SPELL>)
+              (<EQUAL? .WRD ,W?MEEF>
+               <SET OBJ ,MEEF-SPELL>)
+              (<EQUAL? .WRD ,W?VEZZA>
+               <SET OBJ ,VEZZA-SPELL>)
+              (<EQUAL? .WRD ,W?GASPAR>
+               <SET OBJ ,GASPAR-SPELL>)
+              (<EQUAL? .WRD ,W?YOMIN>
+               <SET OBJ ,YOMIN-SPELL>)
+              (<EQUAL? .WRD ,W?YONK>
+               <SET OBJ ,YONK-SPELL>)
+              (<EQUAL? .WRD ,W?MALYON>
+               <SET OBJ ,MALYON-SPELL>)>
+        <COND (.OBJ
+               <OBJ-FOUND .OBJ .TBL>)>
+        <RTRUE>>
\ No newline at end of file
diff --git a/gparser.zap b/gparser.zap
new file mode 100644 (file)
index 0000000..fd31b62
--- /dev/null
@@ -0,0 +1,1684 @@
+
+
+       .FUNCT  PARSER,PTR=P-LEXSTART,WRD,VAL=0,VERB=0,OF-FLAG=0,OWINNER,OMERGED,LEN,DIR=0,NW=0,LW=0,CNT=-1,?TMP2,?TMP1
+?PRG1: IGRTR?  'CNT,P-ITBLLEN \?ELS5
+       JUMP    ?REP2
+?ELS5: ZERO?   P-OFLAG \?CND8
+       GET     P-ITBL,CNT
+       PUT     P-OTBL,CNT,STACK
+?CND8: PUT     P-ITBL,CNT,0
+       JUMP    ?PRG1
+?REP2: SET     'OWINNER,WINNER
+       SET     'OMERGED,P-MERGED
+       SET     'P-ADVERB,FALSE-VALUE
+       SET     'P-MERGED,FALSE-VALUE
+       SET     'P-END-ON-PREP,FALSE-VALUE
+       PUT     P-PRSO,P-MATCHLEN,0
+       PUT     P-PRSI,P-MATCHLEN,0
+       PUT     P-BUTS,P-MATCHLEN,0
+       ZERO?   QUOTE-FLAG \?CND11
+       EQUAL?  WINNER,PLAYER /?CND11
+       SET     'WINNER,PLAYER
+       CALL    META-LOC,PLAYER >HERE
+       CALL    LIT?,HERE >LIT
+?CND11:        SET     'PERFORMING-SPELL,FALSE-VALUE
+       ZERO?   RESERVE-PTR /?ELS18
+       SET     'PTR,RESERVE-PTR
+       CALL    STUFF,RESERVE-LEXV,P-LEXV
+       ZERO?   SUPER-BRIEF \?CND20
+       EQUAL?  PLAYER,WINNER \?CND20
+       CRLF    
+?CND20:        SET     'RESERVE-PTR,FALSE-VALUE
+       SET     'P-CONT,FALSE-VALUE
+       JUMP    ?CND16
+?ELS18:        ZERO?   P-CONT /?ELS26
+       SET     'PTR,P-CONT
+       ZERO?   SUPER-BRIEF \?CND28
+       EQUAL?  PLAYER,WINNER \?CND28
+       EQUAL?  PRSA,V?SAY /?CND28
+       CRLF    
+?CND28:        SET     'P-CONT,FALSE-VALUE
+       JUMP    ?CND16
+?ELS26:        SET     'WINNER,PLAYER
+       SET     'QUOTE-FLAG,FALSE-VALUE
+       LOC     WINNER
+       FSET?   STACK,VEHBIT /?CND35
+       LOC     WINNER >HERE
+?CND35:        CALL    LIT?,HERE >LIT
+       ZERO?   SUPER-BRIEF \?CND38
+       CRLF    
+?CND38:        PRINTI  ">"
+       READ    P-INBUF,P-LEXV
+?CND16:        GETB    P-LEXV,P-LEXWORDS >P-LEN
+       ZERO?   P-LEN \?CND43
+       PRINTI  "I beg your pardon?"
+       CRLF    
+       RFALSE  
+?CND43:        GET     P-LEXV,PTR >WRD
+       EQUAL?  WRD,W?OOPS \?ELS50
+       ADD     PTR,P-LEXELEN
+       GET     P-LEXV,STACK
+       EQUAL?  STACK,W?PERIOD,W?COMMA \?CND51
+       ADD     PTR,P-LEXELEN >PTR
+       DEC     'P-LEN
+?CND51:        GRTR?   P-LEN,1 /?ELS56
+       PRINTI  "I can't help your clumsiness."
+       CRLF    
+       RFALSE  
+?ELS56:        GET     OOPS-TABLE,O-PTR
+       ZERO?   STACK /?ELS60
+       GRTR?   P-LEN,2 \?ELS63
+       ADD     PTR,P-LEXELEN
+       GET     P-LEXV,STACK
+       EQUAL?  STACK,W?QUOTE \?ELS63
+       PRINTI  "Sorry, you can't correct mistakes in quoted text."
+       CRLF    
+       RFALSE  
+?ELS63:        GRTR?   P-LEN,2 \?CND61
+       PRINTI  "Warning: only the first word after OOPS is used."
+       CRLF    
+?CND61:        GET     OOPS-TABLE,O-PTR >?TMP1
+       ADD     PTR,P-LEXELEN
+       GET     P-LEXV,STACK
+       PUT     AGAIN-LEXV,?TMP1,STACK
+       SET     'WINNER,OWINNER
+       MUL     PTR,P-LEXELEN
+       ADD     STACK,6
+       GETB    P-LEXV,STACK >?TMP2
+       MUL     PTR,P-LEXELEN
+       ADD     STACK,7
+       GETB    P-LEXV,STACK >?TMP1
+       GET     OOPS-TABLE,O-PTR
+       MUL     STACK,P-LEXELEN
+       ADD     STACK,3
+       CALL    INBUF-ADD,?TMP2,?TMP1,STACK
+       CALL    STUFF,AGAIN-LEXV,P-LEXV
+       GETB    P-LEXV,P-LEXWORDS >P-LEN
+       GET     OOPS-TABLE,O-START >PTR
+       CALL    INBUF-STUFF,OOPS-INBUF,P-INBUF
+       JUMP    ?CND48
+?ELS60:        PUT     OOPS-TABLE,O-END,FALSE-VALUE
+       PRINTI  "There was no word to replace!"
+       CRLF    
+       RFALSE  
+?ELS50:        EQUAL?  WRD,W?AGAIN,W?G /?CND78
+       SET     'P-NUMBER,0
+?CND78:        PUT     OOPS-TABLE,O-END,FALSE-VALUE
+?CND48:        GET     P-LEXV,PTR
+       EQUAL?  STACK,W?AGAIN,W?G \?ELS83
+       GETB    OOPS-INBUF,1
+       ZERO?   STACK \?ELS86
+       PRINTI  "Beg pardon?"
+       CRLF    
+       RFALSE  
+?ELS86:        ZERO?   P-OFLAG /?ELS90
+       PRINTI  "It's difficult to repeat fragments."
+       CRLF    
+       RFALSE  
+?ELS90:        ZERO?   P-WON \?ELS95
+       PRINTI  "That would just repeat a mistake."
+       CRLF    
+       RFALSE  
+?ELS95:        GRTR?   P-LEN,1 \?ELS99
+       ADD     PTR,P-LEXELEN
+       GET     P-LEXV,STACK
+       EQUAL?  STACK,W?PERIOD,W?COMMA,W?THEN /?THN103
+       ADD     PTR,P-LEXELEN
+       GET     P-LEXV,STACK
+       EQUAL?  STACK,W?AND \?ELS102
+?THN103:       MUL     2,P-LEXELEN
+       ADD     PTR,STACK >PTR
+       GETB    P-LEXV,P-LEXWORDS
+       SUB     STACK,2
+       PUTB    P-LEXV,P-LEXWORDS,STACK
+       JUMP    ?CND84
+?ELS102:       PRINTI  "I couldn't understand that sentence."
+       CRLF    
+       RFALSE  
+?ELS99:        ADD     PTR,P-LEXELEN >PTR
+       GETB    P-LEXV,P-LEXWORDS
+       SUB     STACK,1
+       PUTB    P-LEXV,P-LEXWORDS,STACK
+?CND84:        GETB    P-LEXV,P-LEXWORDS
+       GRTR?   STACK,0 \?ELS113
+       CALL    STUFF,P-LEXV,RESERVE-LEXV
+       SET     'RESERVE-PTR,PTR
+       JUMP    ?CND111
+?ELS113:       SET     'RESERVE-PTR,FALSE-VALUE
+?CND111:       SET     'WINNER,OWINNER
+       SET     'P-MERGED,OMERGED
+       CALL    INBUF-STUFF,OOPS-INBUF,P-INBUF
+       CALL    STUFF,AGAIN-LEXV,P-LEXV
+       SET     'CNT,-1
+       SET     'DIR,AGAIN-DIR
+?PRG116:       IGRTR?  'CNT,P-ITBLLEN \?ELS120
+       JUMP    ?CND81
+?ELS120:       GET     P-OTBL,CNT
+       PUT     P-ITBL,CNT,STACK
+       JUMP    ?PRG116
+?ELS83:        CALL    STUFF,P-LEXV,AGAIN-LEXV
+       CALL    INBUF-STUFF,P-INBUF,OOPS-INBUF
+       PUT     OOPS-TABLE,O-START,PTR
+       MUL     4,P-LEN
+       PUT     OOPS-TABLE,O-LENGTH,STACK
+       GETB    P-LEXV,P-LEXWORDS
+       MUL     P-LEXELEN,STACK
+       ADD     PTR,STACK
+       MUL     2,STACK >LEN
+       SUB     LEN,1
+       GETB    P-LEXV,STACK >?TMP1
+       SUB     LEN,2
+       GETB    P-LEXV,STACK
+       ADD     ?TMP1,STACK
+       PUT     OOPS-TABLE,O-END,STACK
+       SET     'RESERVE-PTR,FALSE-VALUE
+       SET     'LEN,P-LEN
+       SET     'P-DIR,FALSE-VALUE
+       SET     'P-NCN,0
+       SET     'P-GETFLAGS,0
+?PRG125:       DLESS?  'P-LEN,0 \?ELS129
+       SET     'QUOTE-FLAG,FALSE-VALUE
+       JUMP    ?CND81
+?ELS129:       GET     P-LEXV,PTR >WRD
+       ZERO?   WRD \?THN132
+       CALL    NUMBER?,PTR >WRD
+       ZERO?   WRD /?ELS131
+?THN132:       ZERO?   P-LEN \?ELS136
+       SET     'NW,0
+       JUMP    ?CND134
+?ELS136:       ADD     PTR,P-LEXELEN
+       GET     P-LEXV,STACK >NW
+?CND134:       EQUAL?  WRD,W?TO \?ELS141
+       EQUAL?  VERB,ACT?TELL \?ELS141
+       SET     'WRD,W?QUOTE
+       JUMP    ?CND139
+?ELS141:       EQUAL?  WRD,W?THEN \?CND139
+       GRTR?   P-LEN,0 \?CND139
+       ZERO?   VERB \?CND139
+       ZERO?   QUOTE-FLAG \?CND139
+       EQUAL?  LW,0,W?PERIOD \?ELS150
+       SET     'WRD,W?THE
+       JUMP    ?CND139
+?ELS150:       PUT     P-ITBL,P-VERB,ACT?TELL
+       PUT     P-ITBL,P-VERBN,0
+       SET     'WRD,W?QUOTE
+?CND139:       EQUAL?  WRD,W?THEN,W?PERIOD,W?QUOTE \?ELS155
+       EQUAL?  WRD,W?QUOTE \?CND156
+       ZERO?   QUOTE-FLAG /?ELS161
+       SET     'QUOTE-FLAG,FALSE-VALUE
+       JUMP    ?CND156
+?ELS161:       SET     'QUOTE-FLAG,TRUE-VALUE
+?CND156:       ZERO?   P-LEN /?THN165
+       ADD     PTR,P-LEXELEN >P-CONT
+?THN165:       PUTB    P-LEXV,P-LEXWORDS,P-LEN
+       JUMP    ?CND81
+?ELS155:       CALL    WT?,WRD,PS?DIRECTION,P1?DIRECTION >VAL
+       ZERO?   VAL /?ELS168
+       EQUAL?  VERB,FALSE-VALUE,ACT?WALK \?ELS168
+       EQUAL?  LEN,1 /?THN171
+       EQUAL?  LEN,2 \?ELS174
+       EQUAL?  VERB,ACT?WALK /?THN171
+?ELS174:       EQUAL?  NW,W?THEN,W?PERIOD,W?QUOTE \?ELS176
+       LESS?   LEN,2 \?THN171
+?ELS176:       ZERO?   QUOTE-FLAG /?ELS178
+       EQUAL?  LEN,2 \?ELS178
+       EQUAL?  NW,W?QUOTE /?THN171
+?ELS178:       GRTR?   LEN,2 \?ELS168
+       EQUAL?  NW,W?COMMA,W?AND \?ELS168
+?THN171:       SET     'DIR,VAL
+       EQUAL?  NW,W?COMMA,W?AND \?CND181
+       ADD     PTR,P-LEXELEN
+       PUT     P-LEXV,STACK,W?THEN
+?CND181:       GRTR?   LEN,2 /?CND127
+       SET     'QUOTE-FLAG,FALSE-VALUE
+       JUMP    ?CND81
+?ELS168:       CALL    WT?,WRD,PS?VERB,P1?VERB >VAL
+       ZERO?   VAL /?ELS188
+       ZERO?   VERB \?ELS188
+       SET     'VERB,VAL
+       PUT     P-ITBL,P-VERB,VAL
+       PUT     P-ITBL,P-VERBN,P-VTBL
+       PUT     P-VTBL,0,WRD
+       MUL     PTR,2
+       ADD     STACK,2 >CNT
+       GETB    P-LEXV,CNT
+       PUTB    P-VTBL,2,STACK
+       ADD     CNT,1
+       GETB    P-LEXV,STACK
+       PUTB    P-VTBL,3,STACK
+       JUMP    ?CND127
+?ELS188:       CALL    WT?,WRD,PS?PREPOSITION,0 >VAL
+       ZERO?   VAL \?THN193
+       EQUAL?  WRD,W?ALL,W?ONE,W?BOTH /?THN197
+       CALL    WT?,WRD,PS?ADJECTIVE
+       ZERO?   STACK \?THN197
+       CALL    WT?,WRD,PS?OBJECT
+       ZERO?   STACK /?ELS192
+?THN197:       SET     'VAL,0 \?ELS192
+?THN193:       GRTR?   P-LEN,1 \?ELS201
+       EQUAL?  NW,W?OF \?ELS201
+       ZERO?   VAL \?ELS201
+       EQUAL?  WRD,W?ALL,W?ONE,W?A /?ELS201
+       SET     'OF-FLAG,TRUE-VALUE
+       JUMP    ?CND127
+?ELS201:       ZERO?   VAL /?ELS205
+       ZERO?   P-LEN /?THN208
+       EQUAL?  NW,W?THEN,W?PERIOD \?ELS205
+?THN208:       SET     'P-END-ON-PREP,TRUE-VALUE
+       LESS?   P-NCN,2 \?CND127
+       PUT     P-ITBL,P-PREP1,VAL
+       PUT     P-ITBL,P-PREP1N,WRD
+       JUMP    ?CND127
+?ELS205:       EQUAL?  P-NCN,2 \?ELS214
+       PRINTI  "There were too many nouns in that sentence."
+       CRLF    
+       RFALSE  
+?ELS214:       INC     'P-NCN
+       SET     'P-ACT,VERB
+       CALL    CLAUSE,PTR,VAL,WRD >PTR
+       ZERO?   PTR /FALSE
+       LESS?   PTR,0 \?CND127
+       SET     'QUOTE-FLAG,FALSE-VALUE
+       JUMP    ?CND81
+?ELS192:       EQUAL?  WRD,W?OF \?ELS225
+       ZERO?   OF-FLAG /?THN229
+       EQUAL?  NW,W?PERIOD,W?THEN \?ELS228
+?THN229:       CALL    CANT-USE,PTR
+       RFALSE  
+?ELS228:       SET     'OF-FLAG,FALSE-VALUE
+       JUMP    ?CND127
+?ELS225:       CALL    WT?,WRD,PS?BUZZ-WORD
+       ZERO?   STACK /?ELS234
+       JUMP    ?CND127
+?ELS234:       EQUAL?  VERB,ACT?TELL \?ELS236
+       CALL    WT?,WRD,PS?VERB,P1?VERB
+       ZERO?   STACK /?ELS236
+       EQUAL?  WINNER,PLAYER \?ELS236
+       PRINTI  "Please consult your manual for the correct way to talk to other people or creatures."
+       CRLF    
+       RFALSE  
+?ELS236:       CALL    CANT-USE,PTR
+       RFALSE  
+?ELS131:       CALL    UNKNOWN-WORD,PTR
+       RFALSE  
+?CND127:       SET     'LW,WRD
+       ADD     PTR,P-LEXELEN >PTR
+       JUMP    ?PRG125
+?CND81:        PUT     OOPS-TABLE,O-PTR,FALSE-VALUE
+       ZERO?   DIR /?ELS249
+       SET     'PRSA,V?WALK
+       CALL    NULL-F
+       SET     'PRSO,DIR
+       SET     'P-OFLAG,FALSE-VALUE
+       SET     'P-WALK-DIR,DIR
+       SET     'AGAIN-DIR,DIR
+       RETURN  AGAIN-DIR
+?ELS249:       ZERO?   P-OFLAG /?CND253
+       CALL    ORPHAN-MERGE
+?CND253:       SET     'P-WALK-DIR,FALSE-VALUE
+       SET     'AGAIN-DIR,FALSE-VALUE
+       CALL    SYNTAX-CHECK
+       ZERO?   STACK /FALSE
+       CALL    SNARF-OBJECTS
+       ZERO?   STACK /FALSE
+       CALL    MANY-CHECK
+       ZERO?   STACK /FALSE
+       CALL    TAKE-CHECK
+       ZERO?   STACK /FALSE
+       RTRUE
+
+
+       .FUNCT  STUFF,SRC,DEST,MAX=29,PTR=P-LEXSTART,CTR=1,BPTR
+       GETB    SRC,0
+       PUTB    DEST,0,STACK
+       GETB    SRC,1
+       PUTB    DEST,1,STACK
+?PRG1: GET     SRC,PTR
+       PUT     DEST,PTR,STACK
+       MUL     PTR,2
+       ADD     STACK,2 >BPTR
+       GETB    SRC,BPTR
+       PUTB    DEST,BPTR,STACK
+       MUL     PTR,2
+       ADD     STACK,3 >BPTR
+       GETB    SRC,BPTR
+       PUTB    DEST,BPTR,STACK
+       ADD     PTR,P-LEXELEN >PTR
+       IGRTR?  'CTR,MAX \?PRG1
+       RTRUE   
+
+
+       .FUNCT  INBUF-STUFF,SRC,DEST,CNT
+       GETB    SRC,0
+       SUB     STACK,1 >CNT
+?PRG1: GETB    SRC,CNT
+       PUTB    DEST,CNT,STACK
+       DLESS?  'CNT,0 \?PRG1
+       RTRUE   
+
+
+       .FUNCT  INBUF-ADD,LEN,BEG,SLOT,DBEG,CTR=0,TMP,?TMP1
+       GET     OOPS-TABLE,O-END >TMP
+       ZERO?   TMP /?ELS3
+       SET     'DBEG,TMP
+       JUMP    ?CND1
+?ELS3: GET     OOPS-TABLE,O-LENGTH >TMP
+       GETB    AGAIN-LEXV,TMP >?TMP1
+       ADD     TMP,1
+       GETB    AGAIN-LEXV,STACK
+       ADD     ?TMP1,STACK >DBEG
+?CND1: ADD     DBEG,LEN
+       PUT     OOPS-TABLE,O-END,STACK
+?PRG6: ADD     DBEG,CTR >?TMP1
+       ADD     BEG,CTR
+       GETB    P-INBUF,STACK
+       PUTB    OOPS-INBUF,?TMP1,STACK
+       INC     'CTR
+       EQUAL?  CTR,LEN \?PRG6
+       PUTB    AGAIN-LEXV,SLOT,DBEG
+       SUB     SLOT,1
+       PUTB    AGAIN-LEXV,STACK,LEN
+       RTRUE   
+
+
+       .FUNCT  WT?,PTR,BIT,B1=5,OFFS=P-P1OFF,TYP
+       GETB    PTR,P-PSOFF >TYP
+       BTST    TYP,BIT \FALSE
+       GRTR?   B1,4 /TRUE
+       BAND    TYP,P-P1BITS >TYP
+       EQUAL?  TYP,B1 /?CND13
+       INC     'OFFS
+?CND13:        GETB    PTR,OFFS
+       RSTACK  
+
+
+       .FUNCT  CLAUSE,PTR,VAL,WRD,OFF,NUM,ANDFLG=0,FIRST??=1,NW,LW=0,?TMP1
+       SUB     P-NCN,1
+       MUL     STACK,2 >OFF
+       ZERO?   VAL /?ELS3
+       ADD     P-PREP1,OFF >NUM
+       PUT     P-ITBL,NUM,VAL
+       ADD     NUM,1
+       PUT     P-ITBL,STACK,WRD
+       ADD     PTR,P-LEXELEN >PTR
+       JUMP    ?CND1
+?ELS3: INC     'P-LEN
+?CND1: ZERO?   P-LEN \?CND6
+       DEC     'P-NCN
+       RETURN  -1
+?CND6: ADD     P-NC1,OFF >NUM
+       MUL     PTR,2
+       ADD     P-LEXV,STACK
+       PUT     P-ITBL,NUM,STACK
+       GET     P-LEXV,PTR
+       EQUAL?  STACK,W?THE,W?A,W?AN \?CND9
+       GET     P-ITBL,NUM
+       ADD     STACK,4
+       PUT     P-ITBL,NUM,STACK
+?CND9: 
+?PRG12:        DLESS?  'P-LEN,0 \?CND14
+       ADD     NUM,1 >?TMP1
+       MUL     PTR,2
+       ADD     P-LEXV,STACK
+       PUT     P-ITBL,?TMP1,STACK
+       RETURN  -1
+?CND14:        GET     P-LEXV,PTR >WRD
+       ZERO?   WRD \?THN20
+       CALL    NUMBER?,PTR >WRD
+       ZERO?   WRD /?ELS19
+?THN20:        ZERO?   P-LEN \?ELS24
+       SET     'NW,0
+       JUMP    ?CND22
+?ELS24:        ADD     PTR,P-LEXELEN
+       GET     P-LEXV,STACK >NW
+?CND22:        EQUAL?  WRD,W?AND,W?COMMA \?ELS29
+       SET     'ANDFLG,TRUE-VALUE
+       JUMP    ?CND17
+?ELS29:        EQUAL?  WRD,W?ALL,W?ONE,W?BOTH \?ELS31
+       EQUAL?  NW,W?OF \?CND17
+       DEC     'P-LEN
+       ADD     PTR,P-LEXELEN >PTR
+       JUMP    ?CND17
+?ELS31:        EQUAL?  WRD,W?THEN,W?PERIOD /?THN37
+       CALL    WT?,WRD,PS?PREPOSITION
+       ZERO?   STACK /?ELS36
+       GET     P-ITBL,P-VERB
+       ZERO?   STACK /?ELS36
+       ZERO?   FIRST?? \?ELS36
+?THN37:        INC     'P-LEN
+       ADD     NUM,1 >?TMP1
+       MUL     PTR,2
+       ADD     P-LEXV,STACK
+       PUT     P-ITBL,?TMP1,STACK
+       SUB     PTR,P-LEXELEN
+       RSTACK  
+?ELS36:        CALL    WT?,WRD,PS?OBJECT
+       ZERO?   STACK /?ELS42
+       GRTR?   P-LEN,0 \?ELS45
+       EQUAL?  NW,W?OF \?ELS45
+       EQUAL?  WRD,W?ALL,W?ONE /?ELS45
+       JUMP    ?CND17
+?ELS45:        CALL    WT?,WRD,PS?ADJECTIVE,P1?ADJECTIVE
+       ZERO?   STACK /?ELS49
+       ZERO?   NW /?ELS49
+       CALL    WT?,NW,PS?OBJECT
+       ZERO?   STACK /?ELS49
+       JUMP    ?CND17
+?ELS49:        ZERO?   ANDFLG \?ELS53
+       EQUAL?  NW,W?BUT,W?EXCEPT /?ELS53
+       EQUAL?  NW,W?AND,W?COMMA /?ELS53
+       ADD     NUM,1 >?TMP1
+       ADD     PTR,2
+       MUL     STACK,2
+       ADD     P-LEXV,STACK
+       PUT     P-ITBL,?TMP1,STACK
+       RETURN  PTR
+?ELS53:        SET     'ANDFLG,FALSE-VALUE
+       JUMP    ?CND17
+?ELS42:        ZERO?   P-MERGED \?THN62
+       ZERO?   P-OFLAG \?THN62
+       GET     P-ITBL,P-VERB
+       ZERO?   STACK /?ELS59
+?THN62:        CALL    WT?,WRD,PS?ADJECTIVE
+       ZERO?   STACK \?CND17
+       CALL    WT?,WRD,PS?BUZZ-WORD
+       ZERO?   STACK /?ELS59
+       JUMP    ?CND17
+?ELS59:        ZERO?   ANDFLG /?ELS67
+       GET     P-ITBL,P-VERB
+       ZERO?   STACK /?THN70
+       CALL    WT?,WRD,PS?DIRECTION
+       ZERO?   STACK \?THN70
+       CALL    WT?,WRD,PS?VERB
+       ZERO?   STACK /?ELS67
+?THN70:        SUB     PTR,4 >PTR
+       ADD     PTR,2
+       PUT     P-LEXV,STACK,W?THEN
+       ADD     P-LEN,2 >P-LEN
+       JUMP    ?CND17
+?ELS67:        CALL    WT?,WRD,PS?PREPOSITION
+       ZERO?   STACK /?ELS73
+       JUMP    ?CND17
+?ELS73:        CALL    CANT-USE,PTR
+       RFALSE  
+?ELS19:        CALL    UNKNOWN-WORD,PTR
+       RFALSE  
+?CND17:        SET     'LW,WRD
+       SET     'FIRST??,FALSE-VALUE
+       ADD     PTR,P-LEXELEN >PTR
+       JUMP    ?PRG12
+
+
+       .FUNCT  NUMBER?,PTR,CNT,BPTR,CHR,SUM=0,TIM=0,?TMP1
+       MUL     PTR,2
+       ADD     P-LEXV,STACK
+       GETB    STACK,2 >CNT
+       MUL     PTR,2
+       ADD     P-LEXV,STACK
+       GETB    STACK,3 >BPTR
+?PRG1: DLESS?  'CNT,0 \?ELS5
+       JUMP    ?REP2
+?ELS5: GETB    P-INBUF,BPTR >CHR
+       EQUAL?  CHR,58 \?ELS10
+       SET     'TIM,SUM
+       SET     'SUM,0
+       JUMP    ?CND8
+?ELS10:        GRTR?   SUM,10000 /FALSE
+       LESS?   CHR,58 \FALSE
+       GRTR?   CHR,47 \FALSE
+       MUL     SUM,10 >?TMP1
+       SUB     CHR,48
+       ADD     ?TMP1,STACK >SUM
+?CND8: INC     'BPTR
+       JUMP    ?PRG1
+?REP2: PUT     P-LEXV,PTR,W?INTNUM
+       GRTR?   SUM,1000 /FALSE
+       ZERO?   TIM /?CND19
+       LESS?   TIM,8 \?ELS27
+       ADD     TIM,12 >TIM
+       JUMP    ?CND25
+?ELS27:        GRTR?   TIM,23 /FALSE
+?CND25:        MUL     TIM,60
+       ADD     SUM,STACK >SUM
+?CND19:        SET     'P-NUMBER,SUM
+       RETURN  W?INTNUM
+
+
+       .FUNCT  ORPHAN-MERGE,CNT=-1,TEMP,VERB,BEG,END,ADJ=0,WRD,?TMP1
+       SET     'P-OFLAG,FALSE-VALUE
+       GET     P-ITBL,P-VERBN
+       GET     STACK,0 >WRD
+       CALL    WT?,WRD,PS?VERB,P1?VERB >?TMP1
+       GET     P-OTBL,P-VERB
+       EQUAL?  ?TMP1,STACK /?THN4
+       CALL    WT?,WRD,PS?ADJECTIVE
+       ZERO?   STACK /?ELS3
+?THN4: SET     'ADJ,TRUE-VALUE
+       JUMP    ?CND1
+?ELS3: CALL    WT?,WRD,PS?OBJECT,P1?OBJECT
+       ZERO?   STACK /?CND1
+       ZERO?   P-NCN \?CND1
+       PUT     P-ITBL,P-VERB,0
+       PUT     P-ITBL,P-VERBN,0
+       ADD     P-LEXV,2
+       PUT     P-ITBL,P-NC1,STACK
+       ADD     P-LEXV,6
+       PUT     P-ITBL,P-NC1L,STACK
+       SET     'P-NCN,1
+?CND1: GET     P-ITBL,P-VERB >VERB
+       ZERO?   VERB /?ELS12
+       ZERO?   ADJ \?ELS12
+       GET     P-OTBL,P-VERB
+       EQUAL?  VERB,STACK \FALSE
+?ELS12:        EQUAL?  P-NCN,2 /FALSE
+       GET     P-OTBL,P-NC1
+       EQUAL?  STACK,1 \?ELS18
+       GET     P-ITBL,P-PREP1 >TEMP
+       GET     P-OTBL,P-PREP1
+       EQUAL?  TEMP,STACK /?THN22
+       ZERO?   TEMP \FALSE
+?THN22:        ZERO?   ADJ /?ELS26
+       ADD     P-LEXV,2
+       PUT     P-OTBL,P-NC1,STACK
+       GET     P-ITBL,P-NC1L
+       ZERO?   STACK \?CND28
+       ADD     P-LEXV,6
+       PUT     P-ITBL,P-NC1L,STACK
+?CND28:        ZERO?   P-NCN \?CND24
+       SET     'P-NCN,1
+       JUMP    ?CND24
+?ELS26:        GET     P-ITBL,P-NC1
+       PUT     P-OTBL,P-NC1,STACK
+?CND24:        GET     P-ITBL,P-NC1L
+       PUT     P-OTBL,P-NC1L,STACK
+       JUMP    ?CND10
+?ELS18:        GET     P-OTBL,P-NC2
+       EQUAL?  STACK,1 \?ELS39
+       GET     P-ITBL,P-PREP1 >TEMP
+       GET     P-OTBL,P-PREP2
+       EQUAL?  TEMP,STACK /?THN43
+       ZERO?   TEMP \FALSE
+?THN43:        ZERO?   ADJ /?CND45
+       ADD     P-LEXV,2
+       PUT     P-ITBL,P-NC1,STACK
+       GET     P-ITBL,P-NC1L
+       ZERO?   STACK \?CND45
+       ADD     P-LEXV,6
+       PUT     P-ITBL,P-NC1L,STACK
+?CND45:        GET     P-ITBL,P-NC1
+       PUT     P-OTBL,P-NC2,STACK
+       GET     P-ITBL,P-NC1L
+       PUT     P-OTBL,P-NC2L,STACK
+       SET     'P-NCN,2
+       JUMP    ?CND10
+?ELS39:        ZERO?   P-ACLAUSE /?CND10
+       EQUAL?  P-NCN,1 /?ELS58
+       ZERO?   ADJ \?ELS58
+       SET     'P-ACLAUSE,FALSE-VALUE
+       RFALSE  
+?ELS58:        GET     P-ITBL,P-NC1 >BEG
+       ZERO?   ADJ /?CND63
+       ADD     P-LEXV,2 >BEG
+       SET     'ADJ,FALSE-VALUE
+?CND63:        GET     P-ITBL,P-NC1L >END
+?PRG67:        GET     BEG,0 >WRD
+       EQUAL?  BEG,END \?ELS71
+       ZERO?   ADJ /?ELS74
+       CALL    ACLAUSE-WIN,ADJ
+       JUMP    ?CND56
+?ELS74:        SET     'P-ACLAUSE,FALSE-VALUE
+       RFALSE  
+?ELS71:        ZERO?   ADJ \?ELS79
+       GETB    WRD,P-PSOFF
+       BTST    STACK,PS?ADJECTIVE /?THN82
+       EQUAL?  WRD,W?ALL,W?ONE \?ELS79
+?THN82:        SET     'ADJ,WRD
+       JUMP    ?CND69
+?ELS79:        EQUAL?  WRD,W?ONE \?ELS85
+       CALL    ACLAUSE-WIN,ADJ
+       JUMP    ?CND56
+?ELS85:        GETB    WRD,P-PSOFF
+       BTST    STACK,PS?OBJECT \?CND69
+       EQUAL?  WRD,P-ANAM \?ELS90
+       CALL    ACLAUSE-WIN,ADJ
+       JUMP    ?CND10
+?ELS90:        CALL    NCLAUSE-WIN
+       JUMP    ?CND10
+?CND69:        ADD     BEG,P-WORDLEN >BEG
+       ZERO?   END \?PRG67
+       SET     'END,BEG
+       SET     'P-NCN,1
+       SUB     BEG,4
+       PUT     P-ITBL,P-NC1,STACK
+       PUT     P-ITBL,P-NC1L,BEG
+       JUMP    ?PRG67
+?CND56:        
+?CND10:        GET     P-OVTBL,0
+       PUT     P-VTBL,0,STACK
+       GETB    P-OVTBL,2
+       PUTB    P-VTBL,2,STACK
+       GETB    P-OVTBL,3
+       PUTB    P-VTBL,3,STACK
+       PUT     P-OTBL,P-VERBN,P-VTBL
+       PUTB    P-VTBL,2,0
+?PRG96:        IGRTR?  'CNT,P-ITBLLEN \?ELS100
+       SET     'P-MERGED,TRUE-VALUE
+       RTRUE   
+?ELS100:       GET     P-OTBL,CNT
+       PUT     P-ITBL,CNT,STACK
+       JUMP    ?PRG96
+
+
+       .FUNCT  ACLAUSE-WIN,ADJ
+       GET     P-OTBL,P-VERB
+       PUT     P-ITBL,P-VERB,STACK
+       PUT     P-CCTBL,CC-SBPTR,P-ACLAUSE
+       ADD     P-ACLAUSE,1
+       PUT     P-CCTBL,CC-SEPTR,STACK
+       PUT     P-CCTBL,CC-DBPTR,P-ACLAUSE
+       ADD     P-ACLAUSE,1
+       PUT     P-CCTBL,CC-DEPTR,STACK
+       CALL    CLAUSE-COPY,P-OTBL,P-OTBL,ADJ
+       GET     P-OTBL,P-NC2
+       ZERO?   STACK /?ELS2
+       SET     'P-NCN,2
+?ELS2: SET     'P-ACLAUSE,FALSE-VALUE
+       RTRUE   
+
+
+       .FUNCT  NCLAUSE-WIN
+       PUT     P-CCTBL,CC-SBPTR,P-NC1
+       PUT     P-CCTBL,CC-SEPTR,P-NC1L
+       PUT     P-CCTBL,CC-DBPTR,P-ACLAUSE
+       ADD     P-ACLAUSE,1
+       PUT     P-CCTBL,CC-DEPTR,STACK
+       CALL    CLAUSE-COPY,P-ITBL,P-OTBL
+       GET     P-OTBL,P-NC2
+       ZERO?   STACK /?ELS2
+       SET     'P-NCN,2
+?ELS2: SET     'P-ACLAUSE,FALSE-VALUE
+       RTRUE   
+
+
+       .FUNCT  WORD-PRINT,CNT,BUF
+?PRG1: DLESS?  'CNT,0 /TRUE
+       GETB    P-INBUF,BUF
+       PRINTC  STACK
+       INC     'BUF
+       JUMP    ?PRG1
+
+
+       .FUNCT  UNKNOWN-WORD,PTR,BUF,?TMP1
+       PUT     OOPS-TABLE,O-PTR,PTR
+       EQUAL?  PRSA,V?SAY \?CND1
+       PRINTI  "Nothing happens."
+       CRLF    
+       RFALSE  
+?CND1: PRINTI  "I don't know the word """
+       MUL     PTR,2 >BUF
+       ADD     P-LEXV,BUF
+       GETB    STACK,2 >?TMP1
+       ADD     P-LEXV,BUF
+       GETB    STACK,3
+       CALL    WORD-PRINT,?TMP1,STACK
+       PRINTI  """."
+       CRLF    
+       SET     'QUOTE-FLAG,FALSE-VALUE
+       SET     'P-OFLAG,FALSE-VALUE
+       RETURN  P-OFLAG
+
+
+       .FUNCT  CANT-USE,PTR,BUF,?TMP1
+       EQUAL?  PRSA,V?SAY \?CND1
+       PRINTI  "Nothing happens."
+       CRLF    
+       RFALSE  
+?CND1: PRINTI  "You used the word """
+       MUL     PTR,2 >BUF
+       ADD     P-LEXV,BUF
+       GETB    STACK,2 >?TMP1
+       ADD     P-LEXV,BUF
+       GETB    STACK,3
+       CALL    WORD-PRINT,?TMP1,STACK
+       PRINTI  """ in a way that I don't understand."
+       CRLF    
+       SET     'QUOTE-FLAG,FALSE-VALUE
+       SET     'P-OFLAG,FALSE-VALUE
+       RETURN  P-OFLAG
+
+
+       .FUNCT  SYNTAX-CHECK,SYN,LEN,NUM,OBJ,DRIVE1=0,DRIVE2=0,PREP,VERB,TMP,?TMP2,?TMP1
+       GET     P-ITBL,P-VERB >VERB
+       ZERO?   VERB \?CND1
+       PRINTI  "There was no verb in that sentence!"
+       CRLF    
+       RFALSE  
+?CND1: SUB     255,VERB
+       GET     VERBS,STACK >SYN
+       GETB    SYN,0 >LEN
+       INC     'SYN
+?PRG6: GETB    SYN,P-SBITS
+       BAND    STACK,P-SONUMS >NUM
+       GRTR?   P-NCN,NUM \?ELS10
+       JUMP    ?CND8
+?ELS10:        LESS?   NUM,1 /?ELS12
+       ZERO?   P-NCN \?ELS12
+       GET     P-ITBL,P-PREP1 >PREP
+       ZERO?   PREP /?THN15
+       GETB    SYN,P-SPREP1
+       EQUAL?  PREP,STACK \?ELS12
+?THN15:        SET     'DRIVE1,SYN
+       JUMP    ?CND8
+?ELS12:        GETB    SYN,P-SPREP1 >?TMP1
+       GET     P-ITBL,P-PREP1
+       EQUAL?  ?TMP1,STACK \?CND8
+       EQUAL?  NUM,2 \?ELS21
+       EQUAL?  P-NCN,1 \?ELS21
+       SET     'DRIVE2,SYN
+       JUMP    ?CND8
+?ELS21:        GETB    SYN,P-SPREP2 >?TMP1
+       GET     P-ITBL,P-PREP2
+       EQUAL?  ?TMP1,STACK \?CND8
+       CALL    SYNTAX-FOUND,SYN
+       RTRUE   
+?CND8: DLESS?  'LEN,1 \?ELS28
+       ZERO?   DRIVE1 \?REP7
+       ZERO?   DRIVE2 /?ELS31
+       JUMP    ?REP7
+?ELS31:        PRINTI  "That sentence isn't one I recognize."
+       CRLF    
+       RFALSE  
+?ELS28:        ADD     SYN,P-SYNLEN >SYN
+       JUMP    ?PRG6
+?REP7: ZERO?   DRIVE1 /?ELS44
+       GETB    DRIVE1,P-SFWIM1 >?TMP2
+       GETB    DRIVE1,P-SLOC1 >?TMP1
+       GETB    DRIVE1,P-SPREP1
+       CALL    GWIM,?TMP2,?TMP1,STACK >OBJ
+       ZERO?   OBJ /?ELS44
+       PUT     P-PRSO,P-MATCHLEN,1
+       PUT     P-PRSO,1,OBJ
+       CALL    SYNTAX-FOUND,DRIVE1
+       RSTACK  
+?ELS44:        ZERO?   DRIVE2 /?ELS48
+       GETB    DRIVE2,P-SFWIM2 >?TMP2
+       GETB    DRIVE2,P-SLOC2 >?TMP1
+       GETB    DRIVE2,P-SPREP2
+       CALL    GWIM,?TMP2,?TMP1,STACK >OBJ
+       ZERO?   OBJ /?ELS48
+       PUT     P-PRSI,P-MATCHLEN,1
+       PUT     P-PRSI,1,OBJ
+       CALL    SYNTAX-FOUND,DRIVE2
+       RSTACK  
+?ELS48:        EQUAL?  VERB,ACT?FIND \?ELS52
+       PRINTI  "That question can't be answered."
+       CRLF    
+       RFALSE  
+?ELS52:        EQUAL?  WINNER,PLAYER /?ELS56
+       CALL    CANT-ORPHAN
+       RSTACK  
+?ELS56:        CALL    ORPHAN,DRIVE1,DRIVE2
+       PRINTI  "What do you want to "
+       GET     P-OTBL,P-VERBN >TMP
+       ZERO?   TMP \?ELS63
+       PRINTI  "tell"
+       JUMP    ?CND61
+?ELS63:        GETB    P-VTBL,2
+       ZERO?   STACK \?ELS67
+       GET     TMP,0
+       PRINTB  STACK
+       JUMP    ?CND61
+?ELS67:        GETB    TMP,2 >?TMP1
+       GETB    TMP,3
+       CALL    WORD-PRINT,?TMP1,STACK
+       PUTB    P-VTBL,2,0
+?CND61:        ZERO?   DRIVE2 /?CND70
+       PRINTI  " "
+       CALL    THING-PRINT,TRUE-VALUE,TRUE-VALUE
+?CND70:        SET     'P-OFLAG,TRUE-VALUE
+       ZERO?   DRIVE1 /?ELS80
+       GETB    DRIVE1,P-SPREP1
+       JUMP    ?CND76
+?ELS80:        GETB    DRIVE2,P-SPREP2
+?CND76:        CALL    PREP-PRINT,STACK
+       PRINTI  "?"
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  CANT-ORPHAN
+       PRINTI  """I don't understand! What are you referring to?"""
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  ORPHAN,D1,D2,CNT=-1
+       ZERO?   P-MERGED \?CND1
+       PUT     P-OCLAUSE,P-MATCHLEN,0
+?CND1: GET     P-VTBL,0
+       PUT     P-OVTBL,0,STACK
+       GETB    P-VTBL,2
+       PUTB    P-OVTBL,2,STACK
+       GETB    P-VTBL,3
+       PUTB    P-OVTBL,3,STACK
+?PRG4: IGRTR?  'CNT,P-ITBLLEN \?ELS8
+       JUMP    ?REP5
+?ELS8: GET     P-ITBL,CNT
+       PUT     P-OTBL,CNT,STACK
+       JUMP    ?PRG4
+?REP5: EQUAL?  P-NCN,2 \?CND11
+       PUT     P-CCTBL,CC-SBPTR,P-NC2
+       PUT     P-CCTBL,CC-SEPTR,P-NC2L
+       PUT     P-CCTBL,CC-DBPTR,P-NC2
+       PUT     P-CCTBL,CC-DEPTR,P-NC2L
+       CALL    CLAUSE-COPY,P-ITBL,P-OTBL
+?CND11:        LESS?   P-NCN,1 /?CND14
+       PUT     P-CCTBL,CC-SBPTR,P-NC1
+       PUT     P-CCTBL,CC-SEPTR,P-NC1L
+       PUT     P-CCTBL,CC-DBPTR,P-NC1
+       PUT     P-CCTBL,CC-DEPTR,P-NC1L
+       CALL    CLAUSE-COPY,P-ITBL,P-OTBL
+?CND14:        ZERO?   D1 /?ELS21
+       GETB    D1,P-SPREP1
+       PUT     P-OTBL,P-PREP1,STACK
+       PUT     P-OTBL,P-NC1,1
+       RTRUE   
+?ELS21:        ZERO?   D2 /FALSE
+       GETB    D2,P-SPREP2
+       PUT     P-OTBL,P-PREP2,STACK
+       PUT     P-OTBL,P-NC2,1
+       RTRUE   
+
+
+       .FUNCT  THING-PRINT,PRSO?,THE?=0,BEG,END
+       ZERO?   PRSO? /?ELS3
+       GET     P-ITBL,P-NC1 >BEG
+       GET     P-ITBL,P-NC1L >END
+       JUMP    ?CND1
+?ELS3: GET     P-ITBL,P-NC2 >BEG
+       GET     P-ITBL,P-NC2L >END
+?CND1: CALL    BUFFER-PRINT,BEG,END,THE?
+       RSTACK  
+
+
+       .FUNCT  BUFFER-PRINT,BEG,END,CP,NOSP=1,WRD,FIRST??=1,PN=0,Q?=0,?TMP1
+?PRG1: EQUAL?  BEG,END /TRUE
+       GET     BEG,0 >WRD
+       EQUAL?  WRD,W?COMMA \?ELS10
+       PRINTI  ", "
+       JUMP    ?CND8
+?ELS10:        ZERO?   NOSP /?ELS14
+       SET     'NOSP,FALSE-VALUE
+       JUMP    ?CND8
+?ELS14:        PRINTI  " "
+?CND8: EQUAL?  WRD,W?PERIOD,W?COMMA \?ELS22
+       SET     'NOSP,TRUE-VALUE
+       JUMP    ?CND3
+?ELS22:        EQUAL?  WRD,W?ME \?ELS24
+       PRINTD  ME
+       SET     'PN,TRUE-VALUE
+       JUMP    ?CND3
+?ELS24:        EQUAL?  WRD,W?INTNUM \?ELS26
+       PRINTN  P-NUMBER
+       SET     'PN,TRUE-VALUE
+       JUMP    ?CND3
+?ELS26:        ZERO?   FIRST?? /?CND29
+       ZERO?   PN \?CND29
+       ZERO?   CP /?CND29
+       PRINTI  "the "
+?CND29:        ZERO?   P-OFLAG \?THN39
+       ZERO?   P-MERGED /?ELS38
+?THN39:        PRINTB  WRD
+       JUMP    ?CND36
+?ELS38:        EQUAL?  WRD,W?IT \?ELS42
+       CALL    ACCESSIBLE?,P-IT-OBJECT
+       ZERO?   STACK /?ELS42
+       PRINTD  P-IT-OBJECT
+       JUMP    ?CND36
+?ELS42:        GETB    BEG,2 >?TMP1
+       GETB    BEG,3
+       CALL    WORD-PRINT,?TMP1,STACK
+?CND36:        SET     'FIRST??,FALSE-VALUE
+?CND3: ADD     BEG,P-WORDLEN >BEG
+       JUMP    ?PRG1
+
+
+       .FUNCT  PREP-PRINT,PREP,WRD
+       ZERO?   PREP /FALSE
+       PRINTI  " "
+       EQUAL?  PREP,PR?THROUGH \?ELS12
+       PRINTI  "through"
+       RTRUE   
+?ELS12:        CALL    PREP-FIND,PREP >WRD
+       PRINTB  WRD
+       RTRUE   
+
+
+       .FUNCT  CLAUSE-COPY,SRC,DEST,INSRT=0,BEG,END,?TMP1
+       GET     P-CCTBL,CC-SBPTR
+       GET     SRC,STACK >BEG
+       GET     P-CCTBL,CC-SEPTR
+       GET     SRC,STACK >END
+       GET     P-CCTBL,CC-DBPTR >?TMP1
+       GET     P-OCLAUSE,P-MATCHLEN
+       MUL     STACK,P-LEXELEN
+       ADD     STACK,2
+       ADD     P-OCLAUSE,STACK
+       PUT     DEST,?TMP1,STACK
+?PRG1: EQUAL?  BEG,END \?ELS5
+       GET     P-CCTBL,CC-DEPTR >?TMP1
+       GET     P-OCLAUSE,P-MATCHLEN
+       MUL     STACK,P-LEXELEN
+       ADD     STACK,2
+       ADD     P-OCLAUSE,STACK
+       PUT     DEST,?TMP1,STACK
+       RTRUE   
+?ELS5: ZERO?   INSRT /?CND8
+       GET     BEG,0
+       EQUAL?  P-ANAM,STACK \?CND8
+       CALL    CLAUSE-ADD,INSRT
+?CND8: GET     BEG,0
+       CALL    CLAUSE-ADD,STACK
+?CND3: ADD     BEG,P-WORDLEN >BEG
+       JUMP    ?PRG1
+
+
+       .FUNCT  CLAUSE-ADD,WRD,PTR
+       GET     P-OCLAUSE,P-MATCHLEN
+       ADD     STACK,2 >PTR
+       SUB     PTR,1
+       PUT     P-OCLAUSE,STACK,WRD
+       PUT     P-OCLAUSE,PTR,0
+       PUT     P-OCLAUSE,P-MATCHLEN,PTR
+       RTRUE   
+
+
+       .FUNCT  PREP-FIND,PREP,CNT=0,SIZE
+       GET     PREPOSITIONS,0
+       MUL     STACK,2 >SIZE
+?PRG1: IGRTR?  'CNT,SIZE /FALSE
+       GET     PREPOSITIONS,CNT
+       EQUAL?  STACK,PREP \?PRG1
+       SUB     CNT,1
+       GET     PREPOSITIONS,STACK
+       RSTACK  
+
+
+       .FUNCT  SYNTAX-FOUND,SYN
+       SET     'P-SYNTAX,SYN
+       GETB    SYN,P-SACTION >PRSA
+       RETURN  PRSA
+
+
+       .FUNCT  GWIM,GBIT,LBIT,PREP,OBJ
+       EQUAL?  GBIT,RLANDBIT \?CND1
+       RETURN  ROOMS
+?CND1: SET     'P-GWIMBIT,GBIT
+       SET     'P-SLOCBITS,LBIT
+       PUT     P-MERGE,P-MATCHLEN,0
+       CALL    GET-OBJECT,P-MERGE,FALSE-VALUE
+       ZERO?   STACK /?ELS8
+       SET     'P-GWIMBIT,0
+       GET     P-MERGE,P-MATCHLEN
+       EQUAL?  STACK,1 \FALSE
+       GET     P-MERGE,1 >OBJ
+       PRINTI  "("
+       ZERO?   PREP /?ELS18
+       ZERO?   P-END-ON-PREP \?ELS18
+       CALL    PREP-FIND,PREP >PREP
+       PRINTB  PREP
+       EQUAL?  PREP,W?OUT \?CND21
+       PRINTI  " of"
+?CND21:        PRINTI  " "
+       EQUAL?  OBJ,HANDS \?ELS30
+       PRINTI  "your hands"
+       JUMP    ?CND28
+?ELS30:        PRINTI  "the "
+       PRINTD  OBJ
+?CND28:        PRINTI  ")"
+       CRLF    
+       RETURN  OBJ
+?ELS18:        PRINTD  OBJ
+       PRINTI  ")"
+       CRLF    
+       RETURN  OBJ
+?ELS8: SET     'P-GWIMBIT,0
+       RFALSE  
+
+
+       .FUNCT  SNARF-OBJECTS,OPTR,IPTR,L
+       PUT     P-BUTS,P-MATCHLEN,0
+       GET     P-ITBL,P-NC2 >IPTR
+       ZERO?   IPTR /?CND1
+       GETB    P-SYNTAX,P-SLOC2 >P-SLOCBITS
+       GET     P-ITBL,P-NC2L
+       CALL    SNARFEM,IPTR,STACK,P-PRSI
+       ZERO?   STACK /FALSE
+?CND1: GET     P-ITBL,P-NC1 >OPTR
+       ZERO?   OPTR /?CND6
+       GETB    P-SYNTAX,P-SLOC1 >P-SLOCBITS
+       GET     P-ITBL,P-NC1L
+       CALL    SNARFEM,OPTR,STACK,P-PRSO
+       ZERO?   STACK /FALSE
+?CND6: GET     P-BUTS,P-MATCHLEN
+       ZERO?   STACK /TRUE
+       GET     P-PRSO,P-MATCHLEN >L
+       ZERO?   OPTR /?CND14
+       CALL    BUT-MERGE,P-PRSO >P-PRSO
+?CND14:        ZERO?   IPTR /TRUE
+       ZERO?   OPTR /?THN23
+       GET     P-PRSO,P-MATCHLEN
+       EQUAL?  L,STACK \TRUE
+?THN23:        CALL    BUT-MERGE,P-PRSI >P-PRSI
+       RTRUE   
+
+
+       .FUNCT  BUT-MERGE,TBL,LEN,BUTLEN,CNT=1,MATCHES=0,OBJ,NTBL
+       GET     TBL,P-MATCHLEN >LEN
+       PUT     P-MERGE,P-MATCHLEN,0
+?PRG1: DLESS?  'LEN,0 \?ELS5
+       JUMP    ?REP2
+?ELS5: GET     TBL,CNT >OBJ
+       CALL    ZMEMQ,OBJ,P-BUTS
+       ZERO?   STACK /?ELS7
+       JUMP    ?CND3
+?ELS7: ADD     MATCHES,1
+       PUT     P-MERGE,STACK,OBJ
+       INC     'MATCHES
+?CND3: INC     'CNT
+       JUMP    ?PRG1
+?REP2: PUT     P-MERGE,P-MATCHLEN,MATCHES
+       SET     'NTBL,P-MERGE
+       SET     'P-MERGE,TBL
+       RETURN  NTBL
+
+
+       .FUNCT  SNARFEM,PTR,EPTR,TBL,BUT=0,LEN,WV,WRD,NW,WAS-ALL=0
+       SET     'P-AND,FALSE-VALUE
+       EQUAL?  P-GETFLAGS,P-ALL \?CND1
+       SET     'WAS-ALL,TRUE-VALUE
+?CND1: SET     'P-GETFLAGS,0
+       PUT     TBL,P-MATCHLEN,0
+       GET     PTR,0 >WRD
+?PRG4: EQUAL?  PTR,EPTR \?ELS8
+       ZERO?   BUT /?ORP12
+       PUSH    BUT
+       JUMP    ?THN9
+?ORP12:        PUSH    TBL
+?THN9: CALL    GET-OBJECT,STACK >WV
+       ZERO?   WAS-ALL /?CND13
+       SET     'P-GETFLAGS,P-ALL
+?CND13:        RETURN  WV
+?ELS8: ADD     PTR,P-WORDLEN
+       EQUAL?  EPTR,STACK \?ELS21
+       SET     'NW,0
+       JUMP    ?CND19
+?ELS21:        GET     PTR,P-LEXELEN >NW
+?CND19:        EQUAL?  WRD,W?ALL,W?BOTH \?ELS26
+       SET     'P-GETFLAGS,P-ALL
+       EQUAL?  NW,W?OF \?CND24
+       ADD     PTR,P-WORDLEN >PTR
+       JUMP    ?CND24
+?ELS26:        EQUAL?  WRD,W?BUT,W?EXCEPT \?ELS31
+       ZERO?   BUT /?ORP37
+       PUSH    BUT
+       JUMP    ?THN34
+?ORP37:        PUSH    TBL
+?THN34:        CALL    GET-OBJECT,STACK
+       ZERO?   STACK /FALSE
+       SET     'BUT,P-BUTS
+       PUT     BUT,P-MATCHLEN,0
+       JUMP    ?CND6
+?ELS31:        EQUAL?  WRD,W?A,W?ONE \?ELS39
+       ZERO?   P-ADJ \?ELS42
+       SET     'P-GETFLAGS,P-ONE
+       EQUAL?  NW,W?OF \?CND6
+       ADD     PTR,P-WORDLEN >PTR
+       JUMP    ?CND6
+?ELS42:        SET     'P-NAM,P-ONEOBJ
+       ZERO?   BUT /?ORP53
+       PUSH    BUT
+       JUMP    ?THN50
+?ORP53:        PUSH    TBL
+?THN50:        CALL    GET-OBJECT,STACK
+       ZERO?   STACK /FALSE
+       ZERO?   NW /TRUE
+       JUMP    ?CND6
+?ELS39:        EQUAL?  WRD,W?AND,W?COMMA \?ELS57
+       EQUAL?  NW,W?AND,W?COMMA /?ELS57
+       SET     'P-AND,TRUE-VALUE
+       ZERO?   BUT /?ORP65
+       PUSH    BUT
+       JUMP    ?THN62
+?ORP65:        PUSH    TBL
+?THN62:        CALL    GET-OBJECT,STACK
+       ZERO?   STACK \?CND24
+       RFALSE  
+?ELS57:        CALL    WT?,WRD,PS?BUZZ-WORD
+       ZERO?   STACK /?ELS67
+       JUMP    ?CND6
+?ELS67:        EQUAL?  WRD,W?AND,W?COMMA \?ELS69
+       JUMP    ?CND6
+?ELS69:        EQUAL?  WRD,W?OF \?ELS71
+       ZERO?   P-GETFLAGS \?CND24
+       SET     'P-GETFLAGS,P-INHIBIT
+       JUMP    ?CND24
+?ELS71:        CALL    WT?,WRD,PS?ADJECTIVE,P1?ADJECTIVE >WV
+       ZERO?   WV /?ELS76
+       CALL    ADJ-CHECK,WRD
+       ZERO?   STACK /?ELS76
+       SET     'P-ADJ,WV
+       SET     'P-ADJN,WRD
+       JUMP    ?CND6
+?ELS76:        CALL    WT?,WRD,PS?OBJECT,P1?OBJECT
+       ZERO?   STACK /?CND6
+       SET     'P-NAM,WRD
+       SET     'P-ONEOBJ,WRD
+?CND24:        
+?CND6: EQUAL?  PTR,EPTR /?PRG4
+       ADD     PTR,P-WORDLEN >PTR
+       SET     'WRD,NW
+       JUMP    ?PRG4
+
+
+       .FUNCT  ADJ-CHECK,WRD
+       ZERO?   P-ADJ /?ELS5
+       EQUAL?  WRD,W?ENCHAN,W?SPELL,W?CASTLE /FALSE
+       EQUAL?  WRD,W?RIVER /FALSE
+?ELS5: ZERO?   P-ADJ /TRUE
+       EQUAL?  P-ADJ,A?UPPER,A?LOWER \TRUE
+       RFALSE  
+
+
+       .FUNCT  GET-OBJECT,TBL,VRB=1,BITS,LEN,XBITS,TLEN,GCHECK=0,OLEN=0,OBJ
+       SET     'XBITS,P-SLOCBITS
+       GET     TBL,P-MATCHLEN >TLEN
+       BTST    P-GETFLAGS,P-INHIBIT /TRUE
+       ZERO?   P-NAM \?CND4
+       ZERO?   P-ADJ /?CND4
+       CALL    WT?,P-ADJN,PS?OBJECT,P1?OBJECT
+       ZERO?   STACK /?ELS11
+       SET     'P-NAM,P-ADJN
+       SET     'P-ADJ,FALSE-VALUE
+       JUMP    ?CND4
+?ELS11:        CALL    NULL-F
+       ZERO?   STACK /?CND4
+?CND4: ZERO?   P-NAM \?CND14
+       ZERO?   P-ADJ \?CND14
+       EQUAL?  P-GETFLAGS,P-ALL /?CND14
+       ZERO?   P-GWIMBIT \?CND14
+       ZERO?   VRB /FALSE
+       PRINTI  "There seems to be a noun missing in that sentence!"
+       CRLF    
+       RFALSE  
+?CND14:        EQUAL?  P-GETFLAGS,P-ALL \?THN28
+       ZERO?   P-SLOCBITS \?CND25
+?THN28:        SET     'P-SLOCBITS,-1
+?CND25:        SET     'P-TABLE,TBL
+?PRG30:        ZERO?   GCHECK /?ELS34
+       CALL    GLOBAL-CHECK,TBL
+       JUMP    ?CND32
+?ELS34:        ZERO?   LIT \?THN41
+       ZERO?   BLORTED /?CND38
+?THN41:        FCLEAR  PLAYER,TRANSBIT
+       CALL    DO-SL,HERE,SOG,SIR
+       FSET    PLAYER,TRANSBIT
+?CND38:        CALL    DO-SL,PLAYER,SH,SC
+       GET     TBL,0
+       EQUAL?  STACK,TLEN \?CND32
+       ZERO?   P-ADJ /?CND46
+       EQUAL?  P-NAM,W?SPELL,FALSE-VALUE \?CND46
+       SET     'P-NAM,P-ADJN
+?CND46:        CALL    SPELL-CHECK,TBL,P-NAM
+?CND32:        GET     TBL,P-MATCHLEN
+       SUB     STACK,TLEN >LEN
+       BTST    P-GETFLAGS,P-ALL \?ELS53
+       JUMP    ?CND51
+?ELS53:        BTST    P-GETFLAGS,P-ONE \?ELS55
+       ZERO?   LEN /?ELS55
+       EQUAL?  LEN,1 /?CND58
+       RANDOM  LEN
+       GET     TBL,STACK
+       PUT     TBL,1,STACK
+       PRINTI  "(How about the "
+       GET     TBL,1
+       PRINTD  STACK
+       PRINTI  "?)"
+       CRLF    
+?CND58:        PUT     TBL,P-MATCHLEN,1
+       JUMP    ?CND51
+?ELS55:        GRTR?   LEN,1 /?THN67
+       ZERO?   LEN \?CND51
+       EQUAL?  P-SLOCBITS,-1 /?CND51
+?THN67:        EQUAL?  P-SLOCBITS,-1 \?ELS73
+       SET     'P-SLOCBITS,XBITS
+       SET     'OLEN,LEN
+       GET     TBL,P-MATCHLEN
+       SUB     STACK,LEN
+       PUT     TBL,P-MATCHLEN,STACK
+       JUMP    ?PRG30
+?ELS73:        ZERO?   LEN \?CND76
+       SET     'LEN,OLEN
+?CND76:        EQUAL?  WINNER,PLAYER /?ELS81
+       CALL    CANT-ORPHAN
+       RFALSE  
+?ELS81:        ZERO?   VRB /?ELS83
+       ZERO?   P-NAM /?ELS83
+       CALL    WHICH-PRINT,TLEN,LEN,TBL
+       EQUAL?  TBL,P-PRSO \?ELS90
+       PUSH    P-NC1
+       JUMP    ?CND86
+?ELS90:        PUSH    P-NC2
+?CND86:        SET     'P-ACLAUSE,STACK
+       SET     'P-AADJ,P-ADJ
+       SET     'P-ANAM,P-NAM
+       CALL    ORPHAN,FALSE-VALUE,FALSE-VALUE
+       SET     'P-OFLAG,TRUE-VALUE
+       JUMP    ?CND79
+?ELS83:        ZERO?   VRB /?CND79
+       PRINTI  "There seems to be a noun missing in that sentence!"
+       CRLF    
+?CND79:        SET     'P-NAM,FALSE-VALUE
+       SET     'P-ADJ,FALSE-VALUE
+       RFALSE  
+?CND51:        ZERO?   LEN \?ELS100
+       ZERO?   GCHECK /?ELS100
+       ZERO?   VRB /?CND103
+       SET     'P-SLOCBITS,XBITS
+       ZERO?   LIT \?THN110
+       ZERO?   BLORTED \?THN110
+       EQUAL?  PRSA,V?WHAT,V?WHERE,V?TELL /?THN110
+       EQUAL?  PRSA,V?FROTZ,V?WHO \?ELS109
+?THN110:       CALL    OBJ-FOUND,NOT-HERE-OBJECT,TBL
+       SET     'P-XNAM,P-NAM
+       SET     'P-XADJ,P-ADJ
+       SET     'P-XADJN,P-ADJN
+       SET     'P-NAM,FALSE-VALUE
+       SET     'P-ADJ,FALSE-VALUE
+       SET     'P-ADJN,FALSE-VALUE
+       RTRUE   
+?ELS109:       PRINTI  "It's too dark to see!"
+       CRLF    
+?CND103:       SET     'P-NAM,FALSE-VALUE
+       SET     'P-ADJ,FALSE-VALUE
+       RFALSE  
+?ELS100:       ZERO?   LEN \?CND98
+       SET     'GCHECK,TRUE-VALUE
+       JUMP    ?PRG30
+?CND98:        SET     'P-SLOCBITS,XBITS
+       SET     'P-NAM,FALSE-VALUE
+       SET     'P-ADJ,FALSE-VALUE
+       RTRUE   
+
+
+       .FUNCT  MOBY-FIND,TBL,FOO,LEN
+       SET     'P-MOBY-FLAG,TRUE-VALUE
+       SET     'P-SLOCBITS,-1
+       SET     'P-TABLE,TBL
+       SET     'P-NAM,P-XNAM
+       SET     'P-ADJ,P-XADJ
+       PUT     TBL,P-MATCHLEN,0
+       FIRST?  ROOMS >FOO /?KLU17
+?KLU17:        
+?PRG1: ZERO?   FOO \?ELS5
+       JUMP    ?REP2
+?ELS5: CALL    SEARCH-LIST,FOO,TBL,P-SRCALL
+       NEXT?   FOO >FOO /?KLU18
+?KLU18:        JUMP    ?PRG1
+?REP2: GET     TBL,P-MATCHLEN >LEN
+       ZERO?   LEN \?CND8
+       CALL    DO-SL,LOCAL-GLOBALS,1,1
+?CND8: GET     TBL,P-MATCHLEN >LEN
+       ZERO?   LEN \?CND11
+       CALL    DO-SL,ROOMS,1,1
+?CND11:        GET     TBL,P-MATCHLEN >LEN
+       EQUAL?  LEN,1 \?CND14
+       GET     TBL,1 >P-MOBY-FOUND
+?CND14:        SET     'P-MOBY-FLAG,FALSE-VALUE
+       SET     'P-NAM,FALSE-VALUE
+       SET     'P-ADJ,FALSE-VALUE
+       RETURN  LEN
+
+
+       .FUNCT  WHICH-PRINT,TLEN,LEN,TBL,OBJ,RLEN
+       SET     'RLEN,LEN
+       PRINTI  "Which "
+       ZERO?   P-OFLAG \?THN6
+       ZERO?   P-MERGED \?THN6
+       ZERO?   P-AND /?ELS5
+?THN6: ZERO?   P-NAM /?ELS12
+       PUSH    P-NAM
+       JUMP    ?CND8
+?ELS12:        ZERO?   P-ADJ /?ELS15
+       PUSH    P-ADJN
+       JUMP    ?CND8
+?ELS15:        PUSH    W?ONE
+?CND8: PRINTB  STACK
+       JUMP    ?CND3
+?ELS5: EQUAL?  TBL,P-PRSO /?PRD21
+       PUSH    0
+       JUMP    ?PRD22
+?PRD21:        PUSH    1
+?PRD22:        CALL    THING-PRINT,STACK
+?CND3: PRINTI  " do you mean, "
+?PRG25:        INC     'TLEN
+       GET     TBL,TLEN >OBJ
+       PRINTI  "the "
+       PRINTD  OBJ
+       EQUAL?  LEN,2 \?ELS31
+       EQUAL?  RLEN,2 /?CND32
+       PRINTI  ","
+?CND32:        PRINTI  " or "
+       JUMP    ?CND29
+?ELS31:        GRTR?   LEN,2 \?CND29
+       PRINTI  ", "
+?CND29:        DLESS?  'LEN,1 \?PRG25
+       PRINTR  "?"
+
+
+       .FUNCT  GLOBAL-CHECK,TBL,LEN,RMG,RMGL,CNT=0,OBJ,OBITS,FOO
+       GET     TBL,P-MATCHLEN >LEN
+       SET     'OBITS,P-SLOCBITS
+       GETPT   HERE,P?GLOBAL >RMG
+       ZERO?   RMG /?CND1
+       PTSIZE  RMG
+       SUB     STACK,1 >RMGL
+?PRG4: GETB    RMG,CNT >OBJ
+       CALL    THIS-IT?,OBJ,TBL
+       ZERO?   STACK /?CND6
+       CALL    OBJ-FOUND,OBJ,TBL
+?CND6: IGRTR?  'CNT,RMGL \?PRG4
+?CND1: GETPT   HERE,P?PSEUDO >RMG
+       ZERO?   RMG /?CND12
+       PTSIZE  RMG
+       DIV     STACK,4
+       SUB     STACK,1 >RMGL
+       SET     'CNT,0
+?PRG15:        MUL     CNT,2
+       GET     RMG,STACK
+       EQUAL?  P-NAM,STACK \?ELS19
+       SET     'LAST-PSEUDO-LOC,HERE
+       MUL     CNT,2
+       ADD     STACK,1
+       GET     RMG,STACK
+       PUTP    PSEUDO-OBJECT,P?ACTION,STACK
+       GETPT   PSEUDO-OBJECT,P?ACTION
+       SUB     STACK,5 >FOO
+       GET     P-NAM,0
+       PUT     FOO,0,STACK
+       GET     P-NAM,1
+       PUT     FOO,1,STACK
+       CALL    OBJ-FOUND,PSEUDO-OBJECT,TBL
+       JUMP    ?CND12
+?ELS19:        IGRTR?  'CNT,RMGL \?PRG15
+?CND12:        GET     TBL,P-MATCHLEN
+       EQUAL?  STACK,LEN \FALSE
+       SET     'P-SLOCBITS,-1
+       SET     'P-TABLE,TBL
+       CALL    DO-SL,GLOBAL-OBJECTS,1,1
+       SET     'P-SLOCBITS,OBITS
+       RTRUE
+       ;GET    TBL,P-MATCHLEN
+       ;ZERO?  STACK \FALSE
+       ;EQUAL? PRSA,V?LOOK-INSIDE,V?SEARCH,V?EXAMINE \FALSE
+       ;CALL   DO-SL,ROOMS,1,1
+       ;RSTACK 
+
+
+       .FUNCT  DO-SL,OBJ,BIT1,BIT2,BTS
+       ADD     BIT1,BIT2
+       BTST    P-SLOCBITS,STACK \?ELS5
+       CALL    SEARCH-LIST,OBJ,P-TABLE,P-SRCALL
+       RSTACK  
+?ELS5: BTST    P-SLOCBITS,BIT1 \?ELS12
+       CALL    SEARCH-LIST,OBJ,P-TABLE,P-SRCTOP
+       RSTACK  
+?ELS12:        BTST    P-SLOCBITS,BIT2 \TRUE
+       CALL    SEARCH-LIST,OBJ,P-TABLE,P-SRCBOT
+       RSTACK  
+
+
+       .FUNCT  SEARCH-LIST,OBJ,TBL,LVL,FLS,NOBJ
+       FIRST?  OBJ >OBJ \FALSE
+?PRG6: EQUAL?  LVL,P-SRCBOT /?CND8
+       GETPT   OBJ,P?SYNONYM
+       ZERO?   STACK /?CND8
+       CALL    THIS-IT?,OBJ,TBL
+       ZERO?   STACK /?CND8
+       CALL    OBJ-FOUND,OBJ,TBL
+?CND8: EQUAL?  LVL,P-SRCTOP \?THN18
+       FSET?   OBJ,SEARCHBIT /?THN18
+       FSET?   OBJ,SURFACEBIT \?CND13
+?THN18:        FIRST?  OBJ >NOBJ \?CND13
+       FSET?   OBJ,OPENBIT /?THN23
+       FSET?   OBJ,TRANSBIT /?THN23
+       ZERO?   P-MOBY-FLAG /?CND13
+?THN23:        FSET?   OBJ,SURFACEBIT \?ELS29
+       PUSH    P-SRCALL
+       JUMP    ?CND25
+?ELS29:        FSET?   OBJ,SEARCHBIT \?ELS31
+       PUSH    P-SRCALL
+       JUMP    ?CND25
+?ELS31:        PUSH    P-SRCTOP
+?CND25:        CALL    SEARCH-LIST,OBJ,TBL,STACK >FLS
+?CND13:        NEXT?   OBJ >OBJ /?PRG6
+       RTRUE   
+
+
+       .FUNCT  OBJ-FOUND,OBJ,TBL,PTR
+       GET     TBL,P-MATCHLEN >PTR
+       ADD     PTR,1
+       PUT     TBL,STACK,OBJ
+       ADD     PTR,1
+       PUT     TBL,P-MATCHLEN,STACK
+       RTRUE   
+
+
+       .FUNCT  TAKE-CHECK
+       GETB    P-SYNTAX,P-SLOC1
+       CALL    ITAKE-CHECK,P-PRSO,STACK
+       ZERO?   STACK /FALSE
+       GETB    P-SYNTAX,P-SLOC2
+       CALL    ITAKE-CHECK,P-PRSI,STACK
+       RSTACK  
+
+
+       .FUNCT  ITAKE-CHECK,TBL,IBITS,PTR,OBJ,TAKEN
+       GET     TBL,P-MATCHLEN >PTR
+       ZERO?   PTR /TRUE
+       BTST    IBITS,SHAVE /?THN8
+       BTST    IBITS,STAKE \TRUE
+?THN8: 
+?PRG10:        DLESS?  'PTR,0 /TRUE
+       ADD     PTR,1
+       GET     TBL,STACK >OBJ
+       EQUAL?  OBJ,IT \?CND17
+       CALL    ACCESSIBLE?,P-IT-OBJECT
+       ZERO?   STACK \?ELS22
+       PRINTI  "I don't see what you're referring to."
+       CRLF    
+       RFALSE  
+?ELS22:        SET     'OBJ,P-IT-OBJECT
+?CND17:        CALL    HELD?,OBJ
+       ZERO?   STACK \?PRG10
+       EQUAL?  OBJ,HANDS,ME /?PRG10
+       SET     'PRSO,OBJ
+       FSET?   OBJ,TRYTAKEBIT \?ELS34
+       SET     'TAKEN,TRUE-VALUE
+       JUMP    ?CND32
+?ELS34:        EQUAL?  WINNER,PLAYER /?ELS36
+       SET     'TAKEN,FALSE-VALUE
+       JUMP    ?CND32
+?ELS36:        BTST    IBITS,STAKE \?ELS38
+       CALL    ITAKE,FALSE-VALUE
+       EQUAL?  STACK,TRUE-VALUE \?ELS38
+       SET     'TAKEN,FALSE-VALUE
+       JUMP    ?CND32
+?ELS38:        SET     'TAKEN,TRUE-VALUE
+?CND32:        ZERO?   TAKEN /?ELS45
+       BTST    IBITS,SHAVE \?ELS45
+       EQUAL?  WINNER,PLAYER \?ELS45
+       EQUAL?  OBJ,NOT-HERE-OBJECT \?CND48
+       PRINTI  "You don't have that!"
+       CRLF    
+       RFALSE  
+?CND48:        PRINTI  "You don't have "
+       GET     TBL,P-MATCHLEN
+       GRTR?   STACK,1 \?ELS57
+       PRINTI  "all those things"
+       JUMP    ?CND55
+?ELS57:        EQUAL?  OBJ,NOT-HERE-OBJECT \?ELS61
+       PRINTI  "that"
+       JUMP    ?CND55
+?ELS61:        PRINTI  "the "
+       PRINTD  OBJ
+       CALL    THIS-IS-IT,OBJ
+?CND55:        PRINTI  "."
+       CRLF    
+       RFALSE  
+?ELS45:        ZERO?   TAKEN \?PRG10
+       EQUAL?  WINNER,PLAYER \?PRG10
+       PRINTI  "(Taken)"
+       CRLF    
+       JUMP    ?PRG10
+
+
+       .FUNCT  MANY-CHECK,LOSS=0,TMP,?TMP1
+       GET     P-PRSO,P-MATCHLEN
+       GRTR?   STACK,1 \?ELS3
+       GETB    P-SYNTAX,P-SLOC1
+       BTST    STACK,SMANY /?ELS3
+       SET     'LOSS,1
+       JUMP    ?CND1
+?ELS3: GET     P-PRSI,P-MATCHLEN
+       GRTR?   STACK,1 \?CND1
+       GETB    P-SYNTAX,P-SLOC2
+       BTST    STACK,SMANY /?CND1
+       SET     'LOSS,2
+?CND1: ZERO?   LOSS /TRUE
+       PRINTI  "You can't use multiple "
+       EQUAL?  LOSS,2 \?CND18
+       PRINTI  "in"
+?CND18:        PRINTI  "direct objects with """
+       GET     P-ITBL,P-VERBN >TMP
+       ZERO?   TMP \?ELS27
+       PRINTI  "tell"
+       JUMP    ?CND25
+?ELS27:        ZERO?   P-OFLAG \?THN32
+       ZERO?   P-MERGED /?ELS31
+?THN32:        GET     TMP,0
+       PRINTB  STACK
+       JUMP    ?CND25
+?ELS31:        GETB    TMP,2 >?TMP1
+       GETB    TMP,3
+       CALL    WORD-PRINT,?TMP1,STACK
+?CND25:        PRINTI  """."
+       CRLF    
+       RFALSE  
+
+
+       .FUNCT  ZMEMQ,ITM,TBL,SIZE=-1,CNT=1
+       ZERO?   TBL /FALSE
+       LESS?   SIZE,0 /?ELS6
+       SET     'CNT,0
+       JUMP    ?CND4
+?ELS6: GET     TBL,0 >SIZE
+?CND4: 
+?PRG9: GET     TBL,CNT
+       EQUAL?  ITM,STACK \?ELS13
+       MUL     CNT,2
+       ADD     TBL,STACK
+       RSTACK  
+?ELS13:        IGRTR?  'CNT,SIZE \?PRG9
+       RFALSE  
+
+
+       .FUNCT  ZMEMQB,ITM,TBL,SIZE,CNT=0
+?PRG1: GETB    TBL,CNT
+       EQUAL?  ITM,STACK /TRUE
+       IGRTR?  'CNT,SIZE \?PRG1
+       RFALSE  
+
+
+       .FUNCT  LIT?,RM,RMBIT=1,OHERE,LIT=0
+       ZERO?   ALWAYS-LIT /?CND1
+       EQUAL?  WINNER,PLAYER /TRUE
+?CND1: SET     'P-GWIMBIT,ONBIT
+       SET     'OHERE,HERE
+       SET     'HERE,RM
+       ZERO?   RMBIT /?ELS8
+       FSET?   RM,ONBIT \?ELS8
+       SET     'LIT,TRUE-VALUE
+       JUMP    ?CND6
+?ELS8: CALL    NULL-F
+       ZERO?   STACK \TRUE
+       PUT     P-MERGE,P-MATCHLEN,0
+       SET     'P-TABLE,P-MERGE
+       SET     'P-SLOCBITS,-1
+       EQUAL?  OHERE,RM \?CND15
+       CALL    DO-SL,WINNER,1,1
+       EQUAL?  WINNER,PLAYER /?CND15
+       IN?     PLAYER,RM \?CND15
+       CALL    DO-SL,PLAYER,1,1
+?CND15:        CALL    DO-SL,RM,1,1
+       GET     P-TABLE,P-MATCHLEN
+       GRTR?   STACK,0 \?CND6
+       SET     'LIT,TRUE-VALUE
+?CND6: SET     'HERE,OHERE
+       SET     'P-GWIMBIT,0
+       RETURN  LIT
+
+
+       .FUNCT  THIS-IT?,OBJ,TBL,SYNS,?TMP1
+       FSET?   OBJ,INVISIBLE /FALSE
+       ZERO?   P-NAM /?ELS5
+       GETPT   OBJ,P?SYNONYM >SYNS
+       PTSIZE  SYNS
+       DIV     STACK,2
+       SUB     STACK,1
+       CALL    ZMEMQ,P-NAM,SYNS,STACK
+       ZERO?   STACK /FALSE
+?ELS5: ZERO?   P-ADJ /?ELS9
+       GETPT   OBJ,P?ADJECTIVE >SYNS
+       ZERO?   SYNS /FALSE
+       PTSIZE  SYNS
+       SUB     STACK,1
+       CALL    ZMEMQB,P-ADJ,SYNS,STACK
+       ZERO?   STACK /FALSE
+?ELS9: ZERO?   P-GWIMBIT /TRUE
+       FSET?   OBJ,P-GWIMBIT /TRUE
+       RFALSE  
+
+
+       .FUNCT  ACCESSIBLE?,OBJ,L,?TMP1
+       LOC     OBJ >L
+       FSET?   OBJ,INVISIBLE /FALSE
+       EQUAL?  OBJ,PSEUDO-OBJECT \?ELS7
+       EQUAL?  LAST-PSEUDO-LOC,HERE \FALSE
+       RTRUE   
+?ELS7: ZERO?   L /FALSE
+       EQUAL?  L,GLOBAL-OBJECTS /TRUE
+       EQUAL?  L,LOCAL-GLOBALS \?ELS20
+       CALL    GLOBAL-IN?,OBJ,HERE
+       ZERO?   STACK \TRUE
+?ELS20:        CALL    META-LOC,OBJ >?TMP1
+       LOC     WINNER
+       EQUAL?  ?TMP1,HERE,STACK \FALSE
+       LOC     WINNER
+       EQUAL?  L,WINNER,HERE,STACK /TRUE
+       FSET?   L,OPENBIT \FALSE
+       CALL    ACCESSIBLE?,L
+       ZERO?   STACK /FALSE
+       RTRUE   
+
+
+       .FUNCT  META-LOC,OBJ
+?PRG1: ZERO?   OBJ /FALSE
+       IN?     OBJ,GLOBAL-OBJECTS \?CND3
+       RETURN  GLOBAL-OBJECTS
+?CND3: IN?     OBJ,ROOMS \?ELS10
+       RETURN  OBJ
+?ELS10:        LOC     OBJ >OBJ
+       JUMP    ?PRG1
+
+       .ENDI
diff --git a/gparser.zil b/gparser.zil
new file mode 100644 (file)
index 0000000..ef12935
--- /dev/null
@@ -0,0 +1,1550 @@
+                       "Generic PARSER file for
+                           The ZORK Trilogy
+                      started on 7/28/83 by MARC"
+
+;"WHICH and TRAP retrofixes installed"
+
+"Parser global variable convention:  All parser globals will
+  begin with 'P-'.  Local variables are not restricted in any
+  way.
+"
+
+<SETG SIBREAKS ".,\"">
+
+<GLOBAL PRSA <>>
+<GLOBAL PRSI <>>
+<GLOBAL PRSO <>>
+
+<GLOBAL P-TABLE 0>
+<GLOBAL P-ONEOBJ 0>
+<GLOBAL P-SYNTAX 0>
+
+<GLOBAL P-CCTBL <TABLE 0 0 0 0>>
+;"pointers used by CLAUSE-COPY (source/destination beginning/end pointers)"
+<CONSTANT CC-SBPTR 0>
+<CONSTANT CC-SEPTR 1>
+<CONSTANT CC-DBPTR 2>
+<CONSTANT CC-DEPTR 3>
+
+<GLOBAL P-LEN 0>
+<GLOBAL P-DIR 0>
+<GLOBAL HERE 0>
+<GLOBAL WINNER 0>
+
+<GLOBAL P-LEXV
+       <ITABLE 59 (LEXV) 0 #BYTE 0 #BYTE 0> ;<ITABLE BYTE 120>>
+<GLOBAL AGAIN-LEXV
+       <ITABLE 59 (LEXV) 0 #BYTE 0 #BYTE 0> ;<ITABLE BYTE 120>>
+<GLOBAL RESERVE-LEXV
+       <ITABLE 59 (LEXV) 0 #BYTE 0 #BYTE 0> ;<ITABLE BYTE 120>>
+<GLOBAL RESERVE-PTR <>>
+
+;"INBUF - Input buffer for READ"
+
+<GLOBAL P-INBUF
+       <ITABLE 120 (BYTE LENGTH) 0>
+       ;<ITABLE BYTE 60>>
+<GLOBAL OOPS-INBUF
+       <ITABLE 120 (BYTE LENGTH) 0>
+       ;<ITABLE BYTE 60>>
+<GLOBAL OOPS-TABLE <TABLE <> <> <> <>>>
+<CONSTANT O-PTR 0>     "word pointer to unknown token in P-LEXV"
+<CONSTANT O-START 1>   "word pointer to sentence start in P-LEXV"
+<CONSTANT O-LENGTH 2>  "byte length of unparsed tokens in P-LEXV"
+<CONSTANT O-END 3>     "byte pointer to first free byte in OOPS-INBUF"
+
+;"Parse-cont variable"
+
+<GLOBAL P-CONT <>>
+<GLOBAL P-IT-OBJECT <>>
+;<GLOBAL LAST-PSEUDO-LOC <>>
+
+;"Orphan flag"
+
+<GLOBAL P-OFLAG <>>
+<GLOBAL P-MERGED <>>
+<GLOBAL P-ACLAUSE <>>
+<GLOBAL P-ANAM <>>
+<GLOBAL P-AADJ <>>
+;"Parser variables and temporaries"
+
+;"Byte offset to # of entries in LEXV"
+
+<CONSTANT P-LEXWORDS 1> ;"Word offset to start of LEXV entries"
+<CONSTANT P-LEXSTART 1> ;"Number of words per LEXV entry"
+<CONSTANT P-LEXELEN 2>
+<CONSTANT P-WORDLEN 4> ;"Offset to parts of speech byte"
+
+<CONSTANT P-PSOFF 4> ;"Offset to first part of speech"
+<CONSTANT P-P1OFF 5> ;"First part of speech bit mask in PSOFF byte"
+<CONSTANT P-P1BITS 3>
+
+<CONSTANT P-ITBLLEN 9>
+<GLOBAL P-ITBL <TABLE 0 0 0 0 0 0 0 0 0 0>>
+<GLOBAL P-OTBL <TABLE 0 0 0 0 0 0 0 0 0 0>>
+<GLOBAL P-VTBL <TABLE 0 0 0 0>>
+<GLOBAL P-OVTBL <TABLE 0 #BYTE 0 #BYTE 0>>
+
+<GLOBAL P-NCN 0>
+
+<CONSTANT P-VERB 0>
+<CONSTANT P-VERBN 1>
+<CONSTANT P-PREP1 2>
+<CONSTANT P-PREP1N 3>
+<CONSTANT P-PREP2 4>
+<CONSTANT P-PREP2N 5>
+<CONSTANT P-NC1 6>
+<CONSTANT P-NC1L 7>
+<CONSTANT P-NC2 8>
+<CONSTANT P-NC2L 9>
+
+<GLOBAL QUOTE-FLAG <>>
+<GLOBAL P-END-ON-PREP <>>
+
+" Grovel down the input finding the verb, prepositions, and noun clauses.
+   If the input is <direction> or <walk> <direction>, fall out immediately
+   setting PRSA to ,V?WALK and PRSO to <direction>.  Otherwise, perform
+   all required orphaning, syntax checking, and noun clause lookup."
+\f
+<ROUTINE PARSER ("AUX" (PTR ,P-LEXSTART) WRD (VAL 0) (VERB <>) (OF-FLAG <>)
+                      OWINNER OMERGED LEN (DIR <>) (NW 0) (LW 0) (CNT -1))
+       <REPEAT ()
+               <COND (<G? <SET CNT <+ .CNT 1>> ,P-ITBLLEN> <RETURN>)
+                     (T
+                      <COND (<NOT ,P-OFLAG>
+                             <PUT ,P-OTBL .CNT <GET ,P-ITBL .CNT>>)>
+                      <PUT ,P-ITBL .CNT 0>)>>
+       <SET OWINNER ,WINNER>
+       <SET OMERGED ,P-MERGED>
+       <SETG P-ADVERB <>>
+       <SETG P-MERGED <>>
+       <SETG P-END-ON-PREP <>>
+       <PUT ,P-PRSO ,P-MATCHLEN 0>
+       <PUT ,P-PRSI ,P-MATCHLEN 0>
+       <PUT ,P-BUTS ,P-MATCHLEN 0>
+       <COND (<AND <NOT ,QUOTE-FLAG> <N==? ,WINNER ,PLAYER>>
+              <SETG WINNER ,PLAYER>
+              <SETG HERE <META-LOC ,PLAYER>>
+              ;<COND (<NOT <FSET? <LOC ,WINNER> ,VEHBIT>>
+                     <SETG HERE <LOC ,WINNER>>)>
+              <SETG LIT <LIT? ,HERE>>)>
+       %<COND (<==? ,ZORK-NUMBER 5>
+               '<SETG PERFORMING-SPELL <>>)
+              (ELSE
+               '<NULL-F>)>
+       <COND (,RESERVE-PTR
+              <SET PTR ,RESERVE-PTR>
+              <STUFF ,RESERVE-LEXV ,P-LEXV>
+              <COND (<AND <NOT ,SUPER-BRIEF> <EQUAL? ,PLAYER ,WINNER>>
+                     <CRLF>)>
+              <SETG RESERVE-PTR <>>
+              <SETG P-CONT <>>)
+             (,P-CONT
+              <SET PTR ,P-CONT>
+              <COND (<AND <NOT ,SUPER-BRIEF>
+                          <EQUAL? ,PLAYER ,WINNER>
+                          <NOT <VERB? SAY>>>
+                     <CRLF>)>
+              <SETG P-CONT <>>)
+             (T
+              <SETG WINNER ,PLAYER>
+              <SETG QUOTE-FLAG <>>
+              <COND (<NOT <FSET? <LOC ,WINNER> ,VEHBIT>>
+                     <SETG HERE <LOC ,WINNER>>)>
+              <SETG LIT <LIT? ,HERE>>
+              <COND (<NOT ,SUPER-BRIEF> <CRLF>)>
+              <TELL ">">
+              <READ ,P-INBUF ,P-LEXV>)>
+       <SETG P-LEN <GETB ,P-LEXV ,P-LEXWORDS>>
+       <COND (<ZERO? ,P-LEN> <TELL "I beg your pardon?" CR> <RFALSE>)>
+       <COND (<EQUAL? <SET WRD <GET ,P-LEXV .PTR>> ,W?OOPS>
+              <COND (<EQUAL? <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>
+                             ,W?PERIOD ,W?COMMA>
+                     <SET PTR <+ .PTR ,P-LEXELEN>>
+                     <SETG P-LEN <- ,P-LEN 1>>)>
+              <COND (<NOT <G? ,P-LEN 1>>
+                     <TELL "I can't help your clumsiness." CR>
+                     <RFALSE>)
+                    (<GET ,OOPS-TABLE ,O-PTR>
+                     <COND (<AND <G? ,P-LEN 2>
+                                 <EQUAL? <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>
+                                         ,W?QUOTE>>
+                            <TELL
+"Sorry, you can't correct mistakes in quoted text." CR>
+                            <RFALSE>)
+                           (<G? ,P-LEN 2>
+                            <TELL
+"Warning: only the first word after OOPS is used." CR>)>
+                     <PUT ,AGAIN-LEXV <GET ,OOPS-TABLE ,O-PTR>
+                          <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
+                     <SETG WINNER .OWINNER> ;"maybe fix oops vs. chars.?"
+                     <INBUF-ADD <GETB ,P-LEXV <+ <* .PTR ,P-LEXELEN> 6>>
+                                <GETB ,P-LEXV <+ <* .PTR ,P-LEXELEN> 7>>
+                                <+ <* <GET ,OOPS-TABLE ,O-PTR> ,P-LEXELEN> 3>>
+                     <STUFF ,AGAIN-LEXV ,P-LEXV>
+                     <SETG P-LEN <GETB ,P-LEXV ,P-LEXWORDS>>
+                     <SET PTR <GET ,OOPS-TABLE ,O-START>>
+                     <INBUF-STUFF ,OOPS-INBUF ,P-INBUF>)
+                    (T
+                     <PUT ,OOPS-TABLE ,O-END <>>
+                     <TELL "There was no word to replace!" CR>
+                     <RFALSE>)>)
+             (T
+              <COND (<NOT <EQUAL? .WRD ,W?AGAIN ,W?G>>
+                     <SETG P-NUMBER 0>)>
+              <PUT ,OOPS-TABLE ,O-END <>>)>
+       <COND (<EQUAL? <GET ,P-LEXV .PTR> ,W?AGAIN ,W?G>
+              <COND (<ZERO? <GETB ,OOPS-INBUF 1>>
+                     <TELL "Beg pardon?" CR>
+                     <RFALSE>)
+                    (,P-OFLAG
+                     <TELL "It's difficult to repeat fragments." CR>
+                     <RFALSE>)
+                    (<NOT ,P-WON>
+                     <TELL "That would just repeat a mistake." CR>
+                     <RFALSE>)
+                    (<G? ,P-LEN 1>
+                     <COND (<OR <EQUAL? <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>
+                                       ,W?PERIOD ,W?COMMA ,W?THEN>
+                                <EQUAL? <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>
+                                       ,W?AND>>
+                            <SET PTR <+ .PTR <* 2 ,P-LEXELEN>>>
+                            <PUTB ,P-LEXV ,P-LEXWORDS
+                                  <- <GETB ,P-LEXV ,P-LEXWORDS> 2>>)
+                           (T
+                            <TELL "I couldn't understand that sentence." CR>
+                            <RFALSE>)>)
+                    (T
+                     <SET PTR <+ .PTR ,P-LEXELEN>>
+                     <PUTB ,P-LEXV ,P-LEXWORDS
+                           <- <GETB ,P-LEXV ,P-LEXWORDS> 1>>)>
+              <COND (<G? <GETB ,P-LEXV ,P-LEXWORDS> 0>
+                     <STUFF ,P-LEXV ,RESERVE-LEXV>
+                     <SETG RESERVE-PTR .PTR>)
+                    (T
+                     <SETG RESERVE-PTR <>>)>
+              ;<SETG P-LEN <GETB ,AGAIN-LEXV ,P-LEXWORDS>>
+              <SETG WINNER .OWINNER>
+              <SETG P-MERGED .OMERGED>
+              <INBUF-STUFF ,OOPS-INBUF ,P-INBUF>
+              <STUFF ,AGAIN-LEXV ,P-LEXV>
+              <SET CNT -1>
+              <SET DIR ,AGAIN-DIR>
+              <REPEAT ()
+               <COND (<IGRTR? CNT ,P-ITBLLEN> <RETURN>)
+                     (T <PUT ,P-ITBL .CNT <GET ,P-OTBL .CNT>>)>>)
+             (T
+              <STUFF ,P-LEXV ,AGAIN-LEXV>
+              <INBUF-STUFF ,P-INBUF ,OOPS-INBUF>
+              <PUT ,OOPS-TABLE ,O-START .PTR>
+              <PUT ,OOPS-TABLE ,O-LENGTH <* 4 ,P-LEN>>
+              <SET LEN
+                   <* 2 <+ .PTR <* ,P-LEXELEN <GETB ,P-LEXV ,P-LEXWORDS>>>>>
+              <PUT ,OOPS-TABLE ,O-END <+ <GETB ,P-LEXV <- .LEN 1>>
+                                         <GETB ,P-LEXV <- .LEN 2>>>>
+              <SETG RESERVE-PTR <>>
+              <SET LEN ,P-LEN>
+              <SETG P-DIR <>>
+              <SETG P-NCN 0>
+              <SETG P-GETFLAGS 0>
+              <REPEAT ()
+               <COND (<L? <SETG P-LEN <- ,P-LEN 1>> 0>
+                      <SETG QUOTE-FLAG <>>
+                      <RETURN>)
+                     (<OR <SET WRD <GET ,P-LEXV .PTR>>
+                          <SET WRD <NUMBER? .PTR>>>
+                      <COND (<ZERO? ,P-LEN> <SET NW 0>)
+                            (T <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>)>
+                      <COND (<AND <EQUAL? .WRD ,W?TO>
+                                  <EQUAL? .VERB ,ACT?TELL ;,ACT?ASK>>
+                             <SET WRD ,W?QUOTE>)
+                            (<AND <EQUAL? .WRD ,W?THEN>
+                                  <G? ,P-LEN 0>
+                                  <NOT .VERB>
+                                  <NOT ,QUOTE-FLAG> ;"Last NOT added 7/3">
+                             <COND (<EQUAL? .LW 0 ,W?PERIOD>
+                                    <SET WRD ,W?THE>)
+                                   (ELSE
+                                    <PUT ,P-ITBL ,P-VERB ,ACT?TELL>
+                                    <PUT ,P-ITBL ,P-VERBN 0>
+                                    <SET WRD ,W?QUOTE>)>)>
+                      <COND (<EQUAL? .WRD ,W?THEN ,W?PERIOD ,W?QUOTE>
+                             <COND (<EQUAL? .WRD ,W?QUOTE>
+                                    <COND (,QUOTE-FLAG
+                                           <SETG QUOTE-FLAG <>>)
+                                          (T <SETG QUOTE-FLAG T>)>)>
+                             <OR <ZERO? ,P-LEN>
+                                 <SETG P-CONT <+ .PTR ,P-LEXELEN>>>
+                             <PUTB ,P-LEXV ,P-LEXWORDS ,P-LEN>
+                             <RETURN>)
+                            (<AND <SET VAL
+                                       <WT? .WRD
+                                            ,PS?DIRECTION
+                                            ,P1?DIRECTION>>
+                                  %<COND (<==? ,ZORK-NUMBER 4>
+                                          '<EQUAL? .VERB <>
+                                                   ,ACT?WALK ,ACT?FLY>)
+                                         (ELSE
+                                          '<EQUAL? .VERB <>
+                                                   ,ACT?WALK>)>
+                                  <OR <EQUAL? .LEN 1>
+                                      <AND <EQUAL? .LEN 2>
+                                           <EQUAL? .VERB ,ACT?WALK>>
+                                      <AND <EQUAL? .NW
+                                                   ,W?THEN
+                                                   ,W?PERIOD
+                                                   ,W?QUOTE>
+                                           <NOT <L? .LEN 2>>>
+                                      <AND ,QUOTE-FLAG
+                                           <EQUAL? .LEN 2>
+                                           <EQUAL? .NW ,W?QUOTE>>
+                                      <AND <G? .LEN 2>
+                                           <EQUAL? .NW ,W?COMMA ,W?AND>>>>
+                             <SET DIR .VAL>
+                             <COND (<EQUAL? .NW ,W?COMMA ,W?AND>
+                                    <PUT ,P-LEXV
+                                         <+ .PTR ,P-LEXELEN>
+                                         ,W?THEN>)>
+                             <COND (<NOT <G? .LEN 2>>
+                                    <SETG QUOTE-FLAG <>>
+                                    <RETURN>)>)
+                            (<AND <SET VAL <WT? .WRD ,PS?VERB ,P1?VERB>>
+                                  <NOT .VERB>>
+                             <SET VERB .VAL>
+                             <PUT ,P-ITBL ,P-VERB .VAL>
+                             <PUT ,P-ITBL ,P-VERBN ,P-VTBL>
+                             <PUT ,P-VTBL 0 .WRD>
+                             <PUTB ,P-VTBL 2 <GETB ,P-LEXV
+                                                   <SET CNT
+                                                        <+ <* .PTR 2> 2>>>>
+                             <PUTB ,P-VTBL 3 <GETB ,P-LEXV <+ .CNT 1>>>)
+                            (<OR <SET VAL <WT? .WRD ,PS?PREPOSITION 0>>
+                                 <AND <OR <EQUAL? .WRD ,W?ALL ,W?ONE ,W?BOTH>
+                                          <WT? .WRD ,PS?ADJECTIVE>
+                                          <WT? .WRD ,PS?OBJECT>>
+                                      <SET VAL 0>>>
+                             <COND (<AND <G? ,P-LEN 1>
+                                         <EQUAL? .NW ,W?OF>
+                                         <ZERO? .VAL>
+                                         <NOT <EQUAL? .WRD
+                                                      ,W?ALL ,W?ONE ,W?A>>
+                                         ;<NOT <EQUAL? .WRD ,W?BOTH>>>
+                                    <SET OF-FLAG T>)
+                                   (<AND <NOT <ZERO? .VAL>>
+                                         <OR <ZERO? ,P-LEN>
+                                             <EQUAL? .NW ,W?THEN ,W?PERIOD>>>
+                                    <SETG P-END-ON-PREP T>
+                                    <COND (<L? ,P-NCN 2>
+                                           <PUT ,P-ITBL ,P-PREP1 .VAL>
+                                           <PUT ,P-ITBL ,P-PREP1N .WRD>)>)
+                                   (<EQUAL? ,P-NCN 2>
+                                    <TELL
+"There were too many nouns in that sentence." CR>
+                                    <RFALSE>)
+                                   (T
+                                    <SETG P-NCN <+ ,P-NCN 1>>
+                                    <SETG P-ACT .VERB>
+                                    <OR <SET PTR <CLAUSE .PTR .VAL .WRD>>
+                                        <RFALSE>>
+                                    <COND (<L? .PTR 0>
+                                           <SETG QUOTE-FLAG <>>
+                                           <RETURN>)>)>)
+                            (<EQUAL? .WRD ,W?OF>
+                             <COND (<OR <NOT .OF-FLAG>
+                                        <EQUAL? .NW ,W?PERIOD ,W?THEN>>
+                                    <CANT-USE .PTR>
+                                    <RFALSE>)
+                                   (T
+                                    <SET OF-FLAG <>>)>)
+                            (<WT? .WRD ,PS?BUZZ-WORD>)
+                            (<AND <EQUAL? .VERB ,ACT?TELL>
+                                  <WT? .WRD ,PS?VERB ,P1?VERB>
+                                  <EQUAL? ,WINNER ,PLAYER>>
+                             <TELL
+"Please consult your manual for the correct way to talk to other people
+or creatures." CR>
+                             <RFALSE>)
+                            (T
+                             <CANT-USE .PTR>
+                             <RFALSE>)>)
+                     (T
+                      <UNKNOWN-WORD .PTR>
+                      <RFALSE>)>
+               <SET LW .WRD>
+               <SET PTR <+ .PTR ,P-LEXELEN>>>)>
+       <PUT ,OOPS-TABLE ,O-PTR <>>
+       <COND (.DIR
+              <SETG PRSA ,V?WALK>
+              %<COND (<==? ,ZORK-NUMBER 4>
+                      '<COND (<EQUAL? .VERB ,ACT?FLY>
+                              <SETG TRY-FLY T>)
+                             (T
+                              <SETG TRY-FLY <>>)>)
+                     (ELSE '<NULL-F>)>
+              <SETG PRSO .DIR>
+              <SETG P-OFLAG <>>
+              <SETG P-WALK-DIR .DIR>
+              <SETG AGAIN-DIR .DIR>)
+             (ELSE
+              <COND (,P-OFLAG <ORPHAN-MERGE>)>
+              <SETG P-WALK-DIR <>>
+              <SETG AGAIN-DIR <>>
+              <COND (<AND <SYNTAX-CHECK>
+                          <SNARF-OBJECTS>
+                          <MANY-CHECK>
+                          <TAKE-CHECK>>
+                     T)>)>>
+
+<COND (<==? ,ZORK-NUMBER 4>
+       <GLOBAL TRY-FLY <>>)>
+
+<GLOBAL P-ACT <>>
+<GLOBAL P-WALK-DIR <>>
+<GLOBAL AGAIN-DIR <>>
+
+;"For AGAIN purposes, put contents of one LEXV table into another."
+<ROUTINE STUFF (SRC DEST "OPTIONAL" (MAX 29) "AUX" (PTR ,P-LEXSTART) (CTR 1)
+                                                  BPTR)
+        <PUTB .DEST 0 <GETB .SRC 0>>
+        <PUTB .DEST 1 <GETB .SRC 1>>
+        <REPEAT ()
+         <PUT .DEST .PTR <GET .SRC .PTR>>
+         <SET BPTR <+ <* .PTR 2> 2>>
+         <PUTB .DEST .BPTR <GETB .SRC .BPTR>>
+         <SET BPTR <+ <* .PTR 2> 3>>
+         <PUTB .DEST .BPTR <GETB .SRC .BPTR>>
+         <SET PTR <+ .PTR ,P-LEXELEN>>
+         <COND (<IGRTR? CTR .MAX>
+                <RETURN>)>>>
+
+;"Put contents of one INBUF into another"
+<ROUTINE INBUF-STUFF (SRC DEST "AUX" CNT)
+        <SET CNT <- <GETB .SRC 0> 1>>
+        <REPEAT ()
+                <PUTB .DEST .CNT <GETB .SRC .CNT>>
+                <COND (<DLESS? CNT 0> <RETURN>)>>>
+
+;"Put the word in the positions specified from P-INBUF to the end of
+OOPS-INBUF, leaving the appropriate pointers in AGAIN-LEXV"
+<ROUTINE INBUF-ADD (LEN BEG SLOT "AUX" DBEG (CTR 0) TMP)
+        <COND (<SET TMP <GET ,OOPS-TABLE ,O-END>>
+               <SET DBEG .TMP>)
+              (T
+               <SET DBEG <+ <GETB ,AGAIN-LEXV
+                                  <SET TMP <GET ,OOPS-TABLE ,O-LENGTH>>>
+                            <GETB ,AGAIN-LEXV <+ .TMP 1>>>>)>
+        <PUT ,OOPS-TABLE ,O-END <+ .DBEG .LEN>>
+        <REPEAT ()
+         <PUTB ,OOPS-INBUF <+ .DBEG .CTR> <GETB ,P-INBUF <+ .BEG .CTR>>>
+         <SET CTR <+ .CTR 1>>
+         <COND (<EQUAL? .CTR .LEN> <RETURN>)>>
+        <PUTB ,AGAIN-LEXV .SLOT .DBEG>
+        <PUTB ,AGAIN-LEXV <- .SLOT 1> .LEN>>
+
+;"Check whether word pointed at by PTR is the correct part of speech.
+   The second argument is the part of speech (,PS?<part of speech>).  The
+   3rd argument (,P1?<part of speech>), if given, causes the value
+   for that part of speech to be returned."
+\f
+<ROUTINE WT? (PTR BIT "OPTIONAL" (B1 5) "AUX" (OFFS ,P-P1OFF) TYP)
+       <COND (<BTST <SET TYP <GETB .PTR ,P-PSOFF>> .BIT>
+              <COND (<G? .B1 4> <RTRUE>)
+                    (T
+                     <SET TYP <BAND .TYP ,P-P1BITS>>
+                     <COND (<NOT <EQUAL? .TYP .B1>> <SET OFFS <+ .OFFS 1>>)>
+                     <GETB .PTR .OFFS>)>)>>
+
+;" Scan through a noun clause, leave a pointer to its starting location"
+
+<ROUTINE CLAUSE (PTR VAL WRD "AUX" OFF NUM (ANDFLG <>) (FIRST?? T) NW (LW 0))
+       <SET OFF <* <- ,P-NCN 1> 2>>
+       <COND (<NOT <EQUAL? .VAL 0>>
+              <PUT ,P-ITBL <SET NUM <+ ,P-PREP1 .OFF>> .VAL>
+              <PUT ,P-ITBL <+ .NUM 1> .WRD>
+              <SET PTR <+ .PTR ,P-LEXELEN>>)
+             (T <SETG P-LEN <+ ,P-LEN 1>>)>
+       <COND (<ZERO? ,P-LEN> <SETG P-NCN <- ,P-NCN 1>> <RETURN -1>)>
+       <PUT ,P-ITBL <SET NUM <+ ,P-NC1 .OFF>> <REST ,P-LEXV <* .PTR 2>>>
+       <COND (<EQUAL? <GET ,P-LEXV .PTR> ,W?THE ,W?A ,W?AN>
+              <PUT ,P-ITBL .NUM <REST <GET ,P-ITBL .NUM> 4>>)>
+       <REPEAT ()
+               <COND (<L? <SETG P-LEN <- ,P-LEN 1>> 0>
+                      <PUT ,P-ITBL <+ .NUM 1> <REST ,P-LEXV <* .PTR 2>>>
+                      <RETURN -1>)>
+               <COND (<OR <SET WRD <GET ,P-LEXV .PTR>>
+                          <SET WRD <NUMBER? .PTR>>>
+                      <COND (<ZERO? ,P-LEN> <SET NW 0>)
+                            (T <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>)>
+                      <COND (<EQUAL? .WRD ,W?AND ,W?COMMA> <SET ANDFLG T>)
+                            (<EQUAL? .WRD ,W?ALL ,W?ONE ,W?BOTH>
+                             <COND (<EQUAL? .NW ,W?OF>
+                                    <SETG P-LEN <- ,P-LEN 1>>
+                                    <SET PTR <+ .PTR ,P-LEXELEN>>)>)
+                            (<OR <EQUAL? .WRD ,W?THEN ,W?PERIOD>
+                                 <AND <WT? .WRD ,PS?PREPOSITION>
+                                      <GET ,P-ITBL ,P-VERB>
+                                         ;"ADDED 4/27 FOR TURTLE,UP"
+                                      <NOT .FIRST??>>>
+                             <SETG P-LEN <+ ,P-LEN 1>>
+                             <PUT ,P-ITBL
+                                  <+ .NUM 1>
+                                  <REST ,P-LEXV <* .PTR 2>>>
+                             <RETURN <- .PTR ,P-LEXELEN>>)
+                            (<WT? .WRD ,PS?OBJECT>
+                             <COND (<AND <G? ,P-LEN 0>
+                                         <EQUAL? .NW ,W?OF>
+                                         <NOT <EQUAL? .WRD ,W?ALL ,W?ONE>>>
+                                    T)
+                                   (<AND <WT? .WRD
+                                              ,PS?ADJECTIVE
+                                              ,P1?ADJECTIVE>
+                                         <NOT <EQUAL? .NW 0>>
+                                         <WT? .NW ,PS?OBJECT>>)
+                                   (<AND <NOT .ANDFLG>
+                                         <NOT <EQUAL? .NW ,W?BUT ,W?EXCEPT>>
+                                         <NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
+                                    <PUT ,P-ITBL
+                                         <+ .NUM 1>
+                                         <REST ,P-LEXV <* <+ .PTR 2> 2>>>
+                                    <RETURN .PTR>)
+                                   (T <SET ANDFLG <>>)>)
+                            (<AND <OR ,P-MERGED
+                                      ,P-OFLAG
+                                      <NOT <EQUAL? <GET ,P-ITBL ,P-VERB> 0>>>
+                                  <OR <WT? .WRD ,PS?ADJECTIVE>
+                                      <WT? .WRD ,PS?BUZZ-WORD>>>)
+                            (<AND .ANDFLG
+                                  <OR <EQUAL? <GET ,P-ITBL ,P-VERB> 0>
+                                      <WT? .WRD ,PS?DIRECTION>
+                                      <WT? .WRD ,PS?VERB>>>
+                             <SET PTR <- .PTR 4>>
+                             <PUT ,P-LEXV <+ .PTR 2> ,W?THEN>
+                             <SETG P-LEN <+ ,P-LEN 2>>)
+                            (<WT? .WRD ,PS?PREPOSITION> T)
+                            (T
+                             <CANT-USE .PTR>
+                             <RFALSE>)>)
+                     (T <UNKNOWN-WORD .PTR> <RFALSE>)>
+               <SET LW .WRD>
+               <SET FIRST?? <>>
+               <SET PTR <+ .PTR ,P-LEXELEN>>>>
+
+<ROUTINE NUMBER? (PTR "AUX" CNT BPTR CHR (SUM 0) (TIM <>))
+        <SET CNT <GETB <REST ,P-LEXV <* .PTR 2>> 2>>
+        <SET BPTR <GETB <REST ,P-LEXV <* .PTR 2>> 3>>
+        <REPEAT ()
+                <COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)
+                      (T
+                       <SET CHR <GETB ,P-INBUF .BPTR>>
+                       <COND (<EQUAL? .CHR 58>
+                              <SET TIM .SUM>
+                              <SET SUM 0>)
+                             (<G? .SUM 10000> <RFALSE>)
+                             (<AND <L? .CHR 58> <G? .CHR 47>>
+                              <SET SUM <+ <* .SUM 10> <- .CHR 48>>>)
+                             (T <RFALSE>)>
+                       <SET BPTR <+ .BPTR 1>>)>>
+        <PUT ,P-LEXV .PTR ,W?INTNUM>
+        <COND (<G? .SUM 1000> <RFALSE>)
+              (.TIM
+               <COND (<L? .TIM 8> <SET TIM <+ .TIM 12>>)
+                     (<G? .TIM 23> <RFALSE>)>
+               <SET SUM <+ .SUM <* .TIM 60>>>)>
+        <SETG P-NUMBER .SUM>
+        ,W?INTNUM>
+
+<GLOBAL P-NUMBER 0>
+
+<COND (<OR <==? ,ZORK-NUMBER 3>
+          <==? ,ZORK-NUMBER 5>>
+       <GLOBAL P-DIRECTION 0>)>
+
+\f
+;"New ORPHAN-MERGE for TRAP Retrofix 6/21/84"
+
+<ROUTINE ORPHAN-MERGE ("AUX" (CNT -1) TEMP VERB BEG END (ADJ <>) WRD)
+   <SETG P-OFLAG <>>
+   <COND (<OR <EQUAL? <WT? <SET WRD <GET <GET ,P-ITBL ,P-VERBN> 0>>
+                          ,PS?VERB ,P1?VERB>
+                     <GET ,P-OTBL ,P-VERB>>
+             <NOT <ZERO? <WT? .WRD ,PS?ADJECTIVE>>>>
+         <SET ADJ T>)
+        (<AND <NOT <ZERO? <WT? .WRD ,PS?OBJECT ,P1?OBJECT>>>
+              <EQUAL? ,P-NCN 0>>
+         <PUT ,P-ITBL ,P-VERB 0>
+         <PUT ,P-ITBL ,P-VERBN 0>
+         <PUT ,P-ITBL ,P-NC1 <REST ,P-LEXV 2>>
+         <PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>
+         <SETG P-NCN 1>)>
+   <COND (<AND <NOT <ZERO? <SET VERB <GET ,P-ITBL ,P-VERB>>>>
+              <NOT .ADJ>
+              <NOT <EQUAL? .VERB <GET ,P-OTBL ,P-VERB>>>>
+         <RFALSE>)
+        (<EQUAL? ,P-NCN 2> <RFALSE>)
+        (<EQUAL? <GET ,P-OTBL ,P-NC1> 1>
+         <COND (<OR <EQUAL? <SET TEMP <GET ,P-ITBL ,P-PREP1>>
+                         <GET ,P-OTBL ,P-PREP1>>
+                    <ZERO? .TEMP>>
+                <COND (.ADJ
+                       <PUT ,P-OTBL ,P-NC1 <REST ,P-LEXV 2>>
+                       <COND (<ZERO? <GET ,P-ITBL ,P-NC1L>>
+                              <PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>)>
+                       <COND (<ZERO? ,P-NCN> <SETG P-NCN 1>)>)
+                      (T
+                       <PUT ,P-OTBL ,P-NC1 <GET ,P-ITBL ,P-NC1>>)>
+                <PUT ,P-OTBL ,P-NC1L <GET ,P-ITBL ,P-NC1L>>)
+               (T <RFALSE>)>)
+        (<EQUAL? <GET ,P-OTBL ,P-NC2> 1>
+         <COND (<OR <EQUAL? <SET TEMP <GET ,P-ITBL ,P-PREP1>>
+                         <GET ,P-OTBL ,P-PREP2>>
+                    <ZERO? .TEMP>>
+                <COND (.ADJ
+                       <PUT ,P-ITBL ,P-NC1 <REST ,P-LEXV 2>>
+                       <COND (<ZERO? <GET ,P-ITBL ,P-NC1L>>
+                              <PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>)>)>
+                <PUT ,P-OTBL ,P-NC2 <GET ,P-ITBL ,P-NC1>>
+                <PUT ,P-OTBL ,P-NC2L <GET ,P-ITBL ,P-NC1L>>
+                <SETG P-NCN 2>)
+               (T <RFALSE>)>)
+        (<NOT <ZERO? ,P-ACLAUSE>>
+         <COND (<AND <NOT <EQUAL? ,P-NCN 1>> <NOT .ADJ>>
+                <SETG P-ACLAUSE <>>
+                <RFALSE>)
+               (T
+                <SET BEG <GET ,P-ITBL ,P-NC1>>
+                <COND (.ADJ <SET BEG <REST ,P-LEXV 2>> <SET ADJ <>>)>
+                <SET END <GET ,P-ITBL ,P-NC1L>>
+                <REPEAT ()
+                        <SET WRD <GET .BEG 0>>
+                        <COND (<EQUAL? .BEG .END>
+                               <COND (.ADJ <ACLAUSE-WIN .ADJ> <RETURN>)
+                                     (T <SETG P-ACLAUSE <>> <RFALSE>)>)
+                              (<AND <NOT .ADJ>
+                                    <OR <BTST <GETB .WRD ,P-PSOFF>
+                                              ,PS?ADJECTIVE>
+                                        <EQUAL? .WRD ,W?ALL ,W?ONE>>>
+                               <SET ADJ .WRD>)
+                              (<EQUAL? .WRD ,W?ONE>
+                               <ACLAUSE-WIN .ADJ>
+                               <RETURN>)
+                              (<BTST <GETB .WRD ,P-PSOFF> ,PS?OBJECT>
+                               <COND (<EQUAL? .WRD ,P-ANAM>
+                                      <ACLAUSE-WIN .ADJ>)
+                                     (T
+                                      <NCLAUSE-WIN>)>
+                               <RETURN>)>
+                        <SET BEG <REST .BEG ,P-WORDLEN>>
+                        <COND (<EQUAL? .END 0>
+                               <SET END .BEG>
+                               <SETG P-NCN 1>
+                               <PUT ,P-ITBL ,P-NC1 <BACK .BEG 4>>
+                               <PUT ,P-ITBL ,P-NC1L .BEG>)>>)>)>
+   <PUT ,P-VTBL 0 <GET ,P-OVTBL 0>>
+   <PUTB ,P-VTBL 2 <GETB ,P-OVTBL 2>>
+   <PUTB ,P-VTBL 3 <GETB ,P-OVTBL 3>>
+   <PUT ,P-OTBL ,P-VERBN ,P-VTBL>
+   <PUTB ,P-VTBL 2 0>
+   <REPEAT ()
+          <COND (<G? <SET CNT <+ .CNT 1>> ,P-ITBLLEN>
+                 <SETG P-MERGED T>
+                 <RTRUE>)
+                (T <PUT ,P-ITBL .CNT <GET ,P-OTBL .CNT>>)>>
+   T>
+
+;"New ACLAUSE-WIN for TRAP retrofix 6/21/84"
+
+<ROUTINE ACLAUSE-WIN (ADJ)
+       <PUT ,P-ITBL ,P-VERB <GET ,P-OTBL ,P-VERB>>
+       <PUT ,P-CCTBL ,CC-SBPTR ,P-ACLAUSE>
+       <PUT ,P-CCTBL ,CC-SEPTR <+ ,P-ACLAUSE 1>>
+       <PUT ,P-CCTBL ,CC-DBPTR ,P-ACLAUSE>
+       <PUT ,P-CCTBL ,CC-DEPTR <+ ,P-ACLAUSE 1>>
+       <CLAUSE-COPY ,P-OTBL ,P-OTBL .ADJ>
+       <AND <NOT <EQUAL? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>>
+       <SETG P-ACLAUSE <>>
+       <RTRUE>>
+
+<ROUTINE NCLAUSE-WIN ()
+        <PUT ,P-CCTBL ,CC-SBPTR ,P-NC1>
+       <PUT ,P-CCTBL ,CC-SEPTR ,P-NC1L>
+       <PUT ,P-CCTBL ,CC-DBPTR ,P-ACLAUSE>
+       <PUT ,P-CCTBL ,CC-DEPTR <+ ,P-ACLAUSE 1>>
+       <CLAUSE-COPY ,P-ITBL ,P-OTBL>
+       <AND <NOT <EQUAL? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>>
+       <SETG P-ACLAUSE <>>
+       <RTRUE>>
+
+;"Print undefined word in input.
+   PTR points to the unknown word in P-LEXV"
+\f
+<ROUTINE WORD-PRINT (CNT BUF)
+        <REPEAT ()
+                <COND (<DLESS? CNT 0> <RETURN>)
+                      (ELSE
+                       <PRINTC <GETB ,P-INBUF .BUF>>
+                       <SET BUF <+ .BUF 1>>)>>>
+
+<ROUTINE UNKNOWN-WORD (PTR "AUX" BUF)
+       <PUT ,OOPS-TABLE ,O-PTR .PTR>
+       <COND (<VERB? SAY>
+              <TELL "Nothing happens." CR>
+              <RFALSE>)>
+       <TELL "I don't know the word \"">
+       <WORD-PRINT <GETB <REST ,P-LEXV <SET BUF <* .PTR 2>>> 2>
+                   <GETB <REST ,P-LEXV .BUF> 3>>
+       <TELL "\"." CR>
+       <SETG QUOTE-FLAG <>>
+       <SETG P-OFLAG <>>>
+
+<ROUTINE CANT-USE (PTR "AUX" BUF)
+       <COND (<VERB? SAY>
+              <TELL "Nothing happens." CR>
+              <RFALSE>)>
+       <TELL "You used the word \"">
+       <WORD-PRINT <GETB <REST ,P-LEXV <SET BUF <* .PTR 2>>> 2>
+                   <GETB <REST ,P-LEXV .BUF> 3>>
+       <TELL "\" in a way that I don't understand." CR>
+       <SETG QUOTE-FLAG <>>
+       <SETG P-OFLAG <>>>
+
+;" Perform syntax matching operations, using P-ITBL as the source of
+   the verb and adjectives for this input.  Returns false if no
+   syntax matches, and does it's own orphaning.  If return is true,
+   the syntax is saved in P-SYNTAX."
+
+<GLOBAL P-SLOCBITS 0>
+
+<CONSTANT P-SYNLEN 8>
+
+<CONSTANT P-SBITS 0>
+<CONSTANT P-SPREP1 1>
+<CONSTANT P-SPREP2 2>
+<CONSTANT P-SFWIM1 3>
+<CONSTANT P-SFWIM2 4>
+<CONSTANT P-SLOC1 5>
+<CONSTANT P-SLOC2 6>
+<CONSTANT P-SACTION 7>
+<CONSTANT P-SONUMS 3>
+
+<ROUTINE SYNTAX-CHECK ("AUX" SYN LEN NUM OBJ
+                           (DRIVE1 <>) (DRIVE2 <>) PREP VERB TMP)
+       <COND (<ZERO? <SET VERB <GET ,P-ITBL ,P-VERB>>>
+              <TELL "There was no verb in that sentence!" CR>
+              <RFALSE>)>
+       <SET SYN <GET ,VERBS <- 255 .VERB>>>
+       <SET LEN <GETB .SYN 0>>
+       <SET SYN <REST .SYN>>
+       <REPEAT ()
+               <SET NUM <BAND <GETB .SYN ,P-SBITS> ,P-SONUMS>>
+               <COND (<G? ,P-NCN .NUM> T)
+                     (<AND <NOT <L? .NUM 1>>
+                           <ZERO? ,P-NCN>
+                           <OR <ZERO? <SET PREP <GET ,P-ITBL ,P-PREP1>>>
+                               <EQUAL? .PREP <GETB .SYN ,P-SPREP1>>>>
+                      <SET DRIVE1 .SYN>)
+                     (<EQUAL? <GETB .SYN ,P-SPREP1> <GET ,P-ITBL ,P-PREP1>>
+                      <COND (<AND <EQUAL? .NUM 2> <EQUAL? ,P-NCN 1>>
+                             <SET DRIVE2 .SYN>)
+                            (<EQUAL? <GETB .SYN ,P-SPREP2>
+                                  <GET ,P-ITBL ,P-PREP2>>
+                             <SYNTAX-FOUND .SYN>
+                             <RTRUE>)>)>
+               <COND (<DLESS? LEN 1>
+                      <COND (<OR .DRIVE1 .DRIVE2> <RETURN>)
+                            (T
+                             <TELL
+"That sentence isn't one I recognize." CR>
+                             <RFALSE>)>)
+                     (T <SET SYN <REST .SYN ,P-SYNLEN>>)>>
+       <COND (<AND .DRIVE1
+                   <SET OBJ
+                        <GWIM <GETB .DRIVE1 ,P-SFWIM1>
+                              <GETB .DRIVE1 ,P-SLOC1>
+                              <GETB .DRIVE1 ,P-SPREP1>>>>
+              <PUT ,P-PRSO ,P-MATCHLEN 1>
+              <PUT ,P-PRSO 1 .OBJ>
+              <SYNTAX-FOUND .DRIVE1>)
+             (<AND .DRIVE2
+                   <SET OBJ
+                        <GWIM <GETB .DRIVE2 ,P-SFWIM2>
+                              <GETB .DRIVE2 ,P-SLOC2>
+                              <GETB .DRIVE2 ,P-SPREP2>>>>
+              <PUT ,P-PRSI ,P-MATCHLEN 1>
+              <PUT ,P-PRSI 1 .OBJ>
+              <SYNTAX-FOUND .DRIVE2>)
+             (<EQUAL? .VERB ,ACT?FIND>
+              <TELL "That question can't be answered." CR>
+              <RFALSE>)
+             (<NOT <EQUAL? ,WINNER ,PLAYER>>
+              <CANT-ORPHAN>)
+             (T
+              <ORPHAN .DRIVE1 .DRIVE2>
+              <TELL "What do you want to ">
+              <SET TMP <GET ,P-OTBL ,P-VERBN>>
+              <COND (<EQUAL? .TMP 0> <TELL "tell">)
+                    (<ZERO? <GETB ,P-VTBL 2>>
+                     <PRINTB <GET .TMP 0>>)
+                    (T
+                     <WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>
+                     <PUTB ,P-VTBL 2 0>)>
+              <COND (.DRIVE2
+                     <TELL " ">
+                     <THING-PRINT T T>)>
+              <SETG P-OFLAG T>
+              <PREP-PRINT <COND (.DRIVE1 <GETB .DRIVE1 ,P-SPREP1>)
+                                (T <GETB .DRIVE2 ,P-SPREP2>)>>
+              <TELL "?" CR>
+              <RFALSE>)>>
+
+<ROUTINE CANT-ORPHAN ()
+        <TELL "\"I don't understand! What are you referring to?\"" CR>
+        <RFALSE>>
+
+\f
+<ROUTINE ORPHAN (D1 D2 "AUX" (CNT -1))
+       <COND (<NOT ,P-MERGED>
+              <PUT ,P-OCLAUSE ,P-MATCHLEN 0>)>
+       <PUT ,P-OVTBL 0 <GET ,P-VTBL 0>>
+       <PUTB ,P-OVTBL 2 <GETB ,P-VTBL 2>>
+       <PUTB ,P-OVTBL 3 <GETB ,P-VTBL 3>>
+       <REPEAT ()
+               <COND (<IGRTR? CNT ,P-ITBLLEN> <RETURN>)
+                     (T <PUT ,P-OTBL .CNT <GET ,P-ITBL .CNT>>)>>
+       <COND (<EQUAL? ,P-NCN 2>
+              <PUT ,P-CCTBL ,CC-SBPTR ,P-NC2>
+              <PUT ,P-CCTBL ,CC-SEPTR ,P-NC2L>
+              <PUT ,P-CCTBL ,CC-DBPTR ,P-NC2>
+              <PUT ,P-CCTBL ,CC-DEPTR ,P-NC2L>
+              <CLAUSE-COPY ,P-ITBL ,P-OTBL>)>
+       <COND (<NOT <L? ,P-NCN 1>>
+              <PUT ,P-CCTBL ,CC-SBPTR ,P-NC1>
+              <PUT ,P-CCTBL ,CC-SEPTR ,P-NC1L>
+              <PUT ,P-CCTBL ,CC-DBPTR ,P-NC1>
+              <PUT ,P-CCTBL ,CC-DEPTR ,P-NC1L>
+              <CLAUSE-COPY ,P-ITBL ,P-OTBL>)>
+       <COND (.D1
+              <PUT ,P-OTBL ,P-PREP1 <GETB .D1 ,P-SPREP1>>
+              <PUT ,P-OTBL ,P-NC1 1>)
+             (.D2
+              <PUT ,P-OTBL ,P-PREP2 <GETB .D2 ,P-SPREP2>>
+              <PUT ,P-OTBL ,P-NC2 1>)>>
+
+;<ROUTINE CLAUSE-PRINT (BPTR EPTR "OPTIONAL" (THE? T))
+       <BUFFER-PRINT <GET ,P-ITBL .BPTR> <GET ,P-ITBL .EPTR> .THE?>>
+
+<ROUTINE THING-PRINT (PRSO? "OPTIONAL" (THE? <>) "AUX" BEG END)
+        <COND (.PRSO?
+               <SET BEG <GET ,P-ITBL ,P-NC1>>
+               <SET END <GET ,P-ITBL ,P-NC1L>>)
+              (ELSE
+               <SET BEG <GET ,P-ITBL ,P-NC2>>
+               <SET END <GET ,P-ITBL ,P-NC2L>>)>
+        <BUFFER-PRINT .BEG .END .THE?>>
+
+<ROUTINE BUFFER-PRINT (BEG END CP
+                      "AUX" (NOSP T) WRD (FIRST?? T) (PN <>) (Q? <>))
+        <REPEAT ()
+               <COND (<EQUAL? .BEG .END> <RETURN>)
+                     (T
+                      <SET WRD <GET .BEG 0>>
+                      <COND ;(<EQUAL? .WRD ,W?$BUZZ> T)
+                            (<EQUAL? .WRD ,W?COMMA>
+                             <TELL ", ">)
+                            (.NOSP <SET NOSP <>>)
+                            (ELSE <TELL " ">)>
+                      <COND (<EQUAL? .WRD ,W?PERIOD ,W?COMMA>
+                             <SET NOSP T>)
+                            (<EQUAL? .WRD ,W?ME>
+                             <PRINTD ,ME>
+                             <SET PN T>)
+                            (<EQUAL? .WRD ,W?INTNUM>
+                             <PRINTN ,P-NUMBER>
+                             <SET PN T>)
+                            (T
+                             <COND (<AND .FIRST?? <NOT .PN> .CP>
+                                    <TELL "the ">)>
+                             <COND (<OR ,P-OFLAG ,P-MERGED> <PRINTB .WRD>)
+                                   (<AND <EQUAL? .WRD ,W?IT>
+                                         <ACCESSIBLE? ,P-IT-OBJECT>>
+                                    <PRINTD ,P-IT-OBJECT>)
+                                   (T
+                                    <WORD-PRINT <GETB .BEG 2>
+                                                <GETB .BEG 3>>)>
+                             <SET FIRST?? <>>)>)>
+               <SET BEG <REST .BEG ,P-WORDLEN>>>>
+
+<ROUTINE PREP-PRINT (PREP "AUX" WRD)
+       <COND (<NOT <ZERO? .PREP>>
+              <TELL " ">
+              <COND %<COND (<==? ,ZORK-NUMBER 5>
+                            '(<EQUAL? .PREP ,PR?THROUGH>
+                              <TELL "through">))
+                           (ELSE
+                            '(<NULL-F> <RTRUE>))>
+                    (T
+                     <SET WRD <PREP-FIND .PREP>>
+                     <PRINTB .WRD>)>)>>
+
+<ROUTINE CLAUSE-COPY (SRC DEST "OPTIONAL" (INSRT <>) "AUX" BEG END)
+       <SET BEG <GET .SRC <GET ,P-CCTBL ,CC-SBPTR>>>
+       <SET END <GET .SRC <GET ,P-CCTBL ,CC-SEPTR>>>
+       <PUT .DEST
+            <GET ,P-CCTBL ,CC-DBPTR>
+            <REST ,P-OCLAUSE
+                  <+ <* <GET ,P-OCLAUSE ,P-MATCHLEN> ,P-LEXELEN> 2>>>
+       <REPEAT ()
+               <COND (<EQUAL? .BEG .END>
+                      <PUT .DEST
+                           <GET ,P-CCTBL ,CC-DEPTR>
+                           <REST ,P-OCLAUSE
+                                 <+ <* <GET ,P-OCLAUSE ,P-MATCHLEN> ,P-LEXELEN>
+                                    2>>>
+                      <RETURN>)
+                     (T
+                      <COND (<AND .INSRT <EQUAL? ,P-ANAM <GET .BEG 0>>>
+                             <CLAUSE-ADD .INSRT>)>
+                      <CLAUSE-ADD <GET .BEG 0>>)>
+               <SET BEG <REST .BEG ,P-WORDLEN>>>>
+
+\f
+<ROUTINE CLAUSE-ADD (WRD "AUX" PTR)
+       <SET PTR <+ <GET ,P-OCLAUSE ,P-MATCHLEN> 2>>
+       <PUT ,P-OCLAUSE <- .PTR 1> .WRD>
+       <PUT ,P-OCLAUSE .PTR 0>
+       <PUT ,P-OCLAUSE ,P-MATCHLEN .PTR>>
+
+<ROUTINE PREP-FIND (PREP "AUX" (CNT 0) SIZE)
+       <SET SIZE <* <GET ,PREPOSITIONS 0> 2>>
+       <REPEAT ()
+               <COND (<IGRTR? CNT .SIZE> <RFALSE>)
+                     (<EQUAL? <GET ,PREPOSITIONS .CNT> .PREP>
+                      <RETURN <GET ,PREPOSITIONS <- .CNT 1>>>)>>>
+
+<ROUTINE SYNTAX-FOUND (SYN)
+       <SETG P-SYNTAX .SYN>
+       <SETG PRSA <GETB .SYN ,P-SACTION>>>
+
+<GLOBAL P-GWIMBIT 0>
+
+<ROUTINE GWIM (GBIT LBIT PREP "AUX" OBJ)
+       <COND (%<COND (<OR <==? ,ZORK-NUMBER 4>
+                          <==? ,ZORK-NUMBER 5>>
+                      '<EQUAL? .GBIT ,RLANDBIT>)
+                     (ELSE
+                      '<EQUAL? .GBIT ,RMUNGBIT>)>
+              <RETURN ,ROOMS>)>
+       <SETG P-GWIMBIT .GBIT>
+       <SETG P-SLOCBITS .LBIT>
+       <PUT ,P-MERGE ,P-MATCHLEN 0>
+       <COND (<GET-OBJECT ,P-MERGE <>>
+              <SETG P-GWIMBIT 0>
+              <COND (<EQUAL? <GET ,P-MERGE ,P-MATCHLEN> 1>
+                     <SET OBJ <GET ,P-MERGE 1>>
+                     <TELL "(">
+                     <COND (<AND <NOT <ZERO? .PREP>>
+                                 <NOT ,P-END-ON-PREP>>
+                            <PRINTB <SET PREP <PREP-FIND .PREP>>>
+                            <COND (<EQUAL? .PREP ,W?OUT>
+                                   <TELL " of">)>
+                            <TELL " ">
+                            <COND (<EQUAL? .OBJ ,HANDS>
+                                   <TELL "your hands">)
+                                  (T
+                                   <TELL "the " D .OBJ>)>
+                            <TELL ")" CR>)
+                           (ELSE
+                            <TELL D .OBJ ")" CR>)>
+                     .OBJ)>)
+             (T <SETG P-GWIMBIT 0> <RFALSE>)>>
+
+<ROUTINE SNARF-OBJECTS ("AUX" OPTR IPTR L)
+        <PUT ,P-BUTS ,P-MATCHLEN 0>
+        <COND (<NOT <EQUAL? <SET IPTR <GET ,P-ITBL ,P-NC2>> 0>>
+               <SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC2>>
+               <OR <SNARFEM .IPTR <GET ,P-ITBL ,P-NC2L> ,P-PRSI> <RFALSE>>)>
+        <COND (<NOT <EQUAL? <SET OPTR <GET ,P-ITBL ,P-NC1>> 0>>
+               <SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC1>>
+               <OR <SNARFEM .OPTR <GET ,P-ITBL ,P-NC1L> ,P-PRSO> <RFALSE>>)>
+        <COND (<NOT <ZERO? <GET ,P-BUTS ,P-MATCHLEN>>>
+               <SET L <GET ,P-PRSO ,P-MATCHLEN>>
+               <COND (.OPTR <SETG P-PRSO <BUT-MERGE ,P-PRSO>>)>
+               <COND (<AND .IPTR
+                           <OR <NOT .OPTR>
+                               <EQUAL? .L <GET ,P-PRSO ,P-MATCHLEN>>>>
+                      <SETG P-PRSI <BUT-MERGE ,P-PRSI>>)>)>
+        <RTRUE>>
+\f
+<ROUTINE BUT-MERGE (TBL "AUX" LEN BUTLEN (CNT 1) (MATCHES 0) OBJ NTBL)
+       <SET LEN <GET .TBL ,P-MATCHLEN>>
+       <PUT ,P-MERGE ,P-MATCHLEN 0>
+       <REPEAT ()
+               <COND (<DLESS? LEN 0> <RETURN>)
+                     (<ZMEMQ <SET OBJ <GET .TBL .CNT>> ,P-BUTS>)
+                     (T
+                      <PUT ,P-MERGE <+ .MATCHES 1> .OBJ>
+                      <SET MATCHES <+ .MATCHES 1>>)>
+               <SET CNT <+ .CNT 1>>>
+       <PUT ,P-MERGE ,P-MATCHLEN .MATCHES>
+       <SET NTBL ,P-MERGE>
+       <SETG P-MERGE .TBL>
+       .NTBL>
+
+<GLOBAL P-NAM <>>
+<GLOBAL P-ADJ <>>
+<GLOBAL P-ADVERB <>>
+<GLOBAL P-ADJN <>>
+<GLOBAL P-PRSO <ITABLE NONE 50>>
+<GLOBAL P-PRSI <ITABLE NONE 50>>
+<GLOBAL P-BUTS <ITABLE NONE 50>>
+<GLOBAL P-MERGE <ITABLE NONE 50>>
+<GLOBAL P-OCLAUSE <ITABLE NONE 100>>
+<GLOBAL P-MATCHLEN 0>
+<GLOBAL P-GETFLAGS 0>
+<CONSTANT P-ALL 1>
+<CONSTANT P-ONE 2>
+<CONSTANT P-INHIBIT 4>
+\f
+
+<GLOBAL P-AND <>>
+
+<ROUTINE SNARFEM (PTR EPTR TBL "AUX" (BUT <>) LEN WV WRD NW (WAS-ALL <>))
+   <SETG P-AND <>>
+   <COND (<EQUAL? ,P-GETFLAGS ,P-ALL>
+         <SET WAS-ALL T>)>
+   <SETG P-GETFLAGS 0>
+   <PUT .TBL ,P-MATCHLEN 0>
+   <SET WRD <GET .PTR 0>>
+   <REPEAT ()
+          <COND (<EQUAL? .PTR .EPTR>
+                 <SET WV <GET-OBJECT <OR .BUT .TBL>>>
+                 <COND (.WAS-ALL <SETG P-GETFLAGS ,P-ALL>)>
+                 <RETURN .WV>)
+                (T
+                 <COND (<==? .EPTR <REST .PTR ,P-WORDLEN>>
+                        <SET NW 0>)
+                       (T <SET NW <GET .PTR ,P-LEXELEN>>)>
+                 <COND (<EQUAL? .WRD ,W?ALL ,W?BOTH>
+                        <SETG P-GETFLAGS ,P-ALL>
+                        <COND (<EQUAL? .NW ,W?OF>
+                               <SET PTR <REST .PTR ,P-WORDLEN>>)>)
+                       (<EQUAL? .WRD ,W?BUT ,W?EXCEPT>
+                        <OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
+                        <SET BUT ,P-BUTS>
+                        <PUT .BUT ,P-MATCHLEN 0>)
+                       (<EQUAL? .WRD ,W?A ,W?ONE>
+                        <COND (<NOT ,P-ADJ>
+                               <SETG P-GETFLAGS ,P-ONE>
+                               <COND (<EQUAL? .NW ,W?OF>
+                                      <SET PTR <REST .PTR ,P-WORDLEN>>)>)
+                              (T
+                               <SETG P-NAM ,P-ONEOBJ>
+                               <OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
+                               <AND <ZERO? .NW> <RTRUE>>)>)
+                       (<AND <EQUAL? .WRD ,W?AND ,W?COMMA>
+                             <NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
+                        <SETG P-AND T>
+                        <OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
+                        T)
+                       (<WT? .WRD ,PS?BUZZ-WORD>)
+                       (<EQUAL? .WRD ,W?AND ,W?COMMA>)
+                       (<EQUAL? .WRD ,W?OF>
+                        <COND (<ZERO? ,P-GETFLAGS>
+                               <SETG P-GETFLAGS ,P-INHIBIT>)>)
+                       (<AND <SET WV <WT? .WRD ,PS?ADJECTIVE ,P1?ADJECTIVE>>
+                             %<COND (<==? ,ZORK-NUMBER 5>
+                                     '<ADJ-CHECK .WRD>)
+                                    (ELSE
+                                     '<NOT ,P-ADJ>)>>
+                        <SETG P-ADJ .WV>
+                        <SETG P-ADJN .WRD>)
+                       (<WT? .WRD ,PS?OBJECT ,P1?OBJECT>
+                        <SETG P-NAM .WRD>
+                        <SETG P-ONEOBJ .WRD>)>)>
+          <COND (<NOT <EQUAL? .PTR .EPTR>>
+                 <SET PTR <REST .PTR ,P-WORDLEN>>
+                 <SET WRD .NW>)>>>
+
+<COND (<==? ,ZORK-NUMBER 5>
+       <ROUTINE ADJ-CHECK (WRD)
+        <COND (<AND ,P-ADJ
+                    <OR <EQUAL? .WRD ,W?ENCHAN ,W?SPELL ,W?CASTLE>
+                        <EQUAL? .WRD ,W?RIVER>>>
+               <RFALSE>)
+              (<NOT ,P-ADJ>
+               <RTRUE>)
+              (<EQUAL? ,P-ADJ ,A?UPPER ,A?LOWER>
+               <RFALSE>)
+              (T
+               <RTRUE>)>>)>
+
+<CONSTANT SH 128>
+<CONSTANT SC 64>
+<CONSTANT SIR 32>
+<CONSTANT SOG 16>
+<CONSTANT STAKE 8>
+<CONSTANT SMANY 4>
+<CONSTANT SHAVE 2>
+
+<ROUTINE GET-OBJECT (TBL
+                    "OPTIONAL" (VRB T)
+                    "AUX" BITS LEN XBITS TLEN (GCHECK <>) (OLEN 0) OBJ)
+        <SET XBITS ,P-SLOCBITS>
+        <SET TLEN <GET .TBL ,P-MATCHLEN>>
+        <COND (<BTST ,P-GETFLAGS ,P-INHIBIT> <RTRUE>)>
+        <COND (<AND <NOT ,P-NAM> ,P-ADJ>
+               <COND (<WT? ,P-ADJN ,PS?OBJECT ,P1?OBJECT>
+                      <SETG P-NAM ,P-ADJN>
+                      <SETG P-ADJ <>>)
+                     %<COND (<==? ,ZORK-NUMBER 3>
+                             '(<SET BITS
+                                    <WT? ,P-ADJN
+                                         ,PS?DIRECTION ,P1?DIRECTION>>
+                               <SETG P-ADJ <>>
+                               <PUT .TBL ,P-MATCHLEN 1>
+                               <PUT .TBL 1 ,INTDIR>
+                               <SETG P-DIRECTION .BITS>
+                               <RTRUE>))
+                            (ELSE '(<NULL-F> T))>>)>
+        <COND (<AND <NOT ,P-NAM>
+                    <NOT ,P-ADJ>
+                    <NOT <EQUAL? ,P-GETFLAGS ,P-ALL>>
+                    <ZERO? ,P-GWIMBIT>>
+               <COND (.VRB
+                      <TELL
+"There seems to be a noun missing in that sentence!" CR>)>
+               <RFALSE>)>
+        <COND (<OR <NOT <EQUAL? ,P-GETFLAGS ,P-ALL>> <ZERO? ,P-SLOCBITS>>
+               <SETG P-SLOCBITS -1>)>
+        <SETG P-TABLE .TBL>
+        <PROG ()
+              <COND (.GCHECK <GLOBAL-CHECK .TBL>)
+                    (T
+                     <COND (%<COND (<==? ,ZORK-NUMBER 5>
+                                    '<OR ,LIT ,BLORTED>)
+                                   (ELSE
+                                    ',LIT)>
+                            <FCLEAR ,PLAYER ,TRANSBIT>
+                            <DO-SL ,HERE ,SOG ,SIR>
+                            <FSET ,PLAYER ,TRANSBIT>)>
+                     <DO-SL ,PLAYER ,SH ,SC>
+                     %<COND (<OR <==? ,ZORK-NUMBER 4>
+                                 <==? ,ZORK-NUMBER 5>>
+                             '<COND (<EQUAL? <GET .TBL 0> .TLEN>
+                                     <COND (<AND ,P-ADJ
+                                                 <EQUAL? ,P-NAM ,W?SPELL <>>>
+                                            <SETG P-NAM ,P-ADJN>)>
+                                     <SPELL-CHECK .TBL ,P-NAM>)>)
+                            (ELSE <NULL-F>)>)>
+              <SET LEN <- <GET .TBL ,P-MATCHLEN> .TLEN>>
+              <COND (<BTST ,P-GETFLAGS ,P-ALL>)
+                    (<AND <BTST ,P-GETFLAGS ,P-ONE>
+                          <NOT <ZERO? .LEN>>>
+                     <COND (<NOT <EQUAL? .LEN 1>>
+                            <PUT .TBL 1 <GET .TBL <RANDOM .LEN>>>
+                            <TELL "(How about the ">
+                            <PRINTD <GET .TBL 1>>
+                            <TELL "?)" CR>)>
+                     <PUT .TBL ,P-MATCHLEN 1>)
+                    (<OR <G? .LEN 1>
+                         <AND <ZERO? .LEN> <NOT <EQUAL? ,P-SLOCBITS -1>>>>
+                     <COND (<EQUAL? ,P-SLOCBITS -1>
+                            <SETG P-SLOCBITS .XBITS>
+                            <SET OLEN .LEN>
+                            <PUT .TBL
+                                 ,P-MATCHLEN
+                                 <- <GET .TBL ,P-MATCHLEN> .LEN>>
+                            <AGAIN>)
+                           (T
+                            <COND (<ZERO? .LEN> <SET LEN .OLEN>)>
+                            <COND (<NOT <EQUAL? ,WINNER ,PLAYER>>
+                                   <CANT-ORPHAN>
+                                   <RFALSE>)
+                                  (<AND .VRB ,P-NAM>
+                                   <WHICH-PRINT .TLEN .LEN .TBL>
+                                   <SETG P-ACLAUSE
+                                         <COND (<EQUAL? .TBL ,P-PRSO> ,P-NC1)
+                                               (T ,P-NC2)>>
+                                   <SETG P-AADJ ,P-ADJ>
+                                   <SETG P-ANAM ,P-NAM>
+                                   <ORPHAN <> <>>
+                                   <SETG P-OFLAG T>)
+                                  (.VRB
+                                   <TELL
+"There seems to be a noun missing in that sentence!" CR>)>
+                            <SETG P-NAM <>>
+                            <SETG P-ADJ <>>
+                            <RFALSE>)>)>
+              <COND (<AND <ZERO? .LEN> .GCHECK>
+                     <COND (.VRB
+                            ;"next added 1/2/85 by JW"
+                            <SETG P-SLOCBITS .XBITS>
+                            <COND (%<COND (<==? ,ZORK-NUMBER 4>
+                                           '<OR ,LIT
+                                                <VERB? TELL FROTZ>>)
+                                          (<==? ,ZORK-NUMBER 5>
+                                           '<OR ,LIT
+                                                ,BLORTED
+                                                <VERB? TELL WHERE WHAT
+                                                       WHO FROTZ>>)
+                                          (ELSE
+                                           '<OR ,LIT
+                                                <VERB? TELL
+                                                       ;WHERE ;WHAT ;WHO>>)>
+                                   ;"Changed 6/10/83 - MARC"
+                                   <OBJ-FOUND ,NOT-HERE-OBJECT .TBL>
+                                   <SETG P-XNAM ,P-NAM>
+                                   <SETG P-XADJ ,P-ADJ>
+                                   <SETG P-XADJN ,P-ADJN>
+                                   <SETG P-NAM <>>
+                                   <SETG P-ADJ <>>
+                                   <SETG P-ADJN <>>
+                                   <RTRUE>)
+                                  (T <TELL "It's too dark to see!" CR>)>)>
+                     <SETG P-NAM <>>
+                     <SETG P-ADJ <>>
+                     <RFALSE>)
+                    (<ZERO? .LEN> <SET GCHECK T> <AGAIN>)>
+              <SETG P-SLOCBITS .XBITS>
+              <SETG P-NAM <>>
+              <SETG P-ADJ <>>
+              <RTRUE>>>
+
+<COND (<OR <==? ,ZORK-NUMBER 4>
+          <==? ,ZORK-NUMBER 5>>
+<ROUTINE MOBY-FIND (TBL "AUX" FOO LEN)
+        <SETG P-MOBY-FLAG T>
+        <SETG P-SLOCBITS -1>
+        <SETG P-TABLE .TBL>
+        <SETG P-NAM ,P-XNAM>
+        <SETG P-ADJ ,P-XADJ>
+        <PUT .TBL ,P-MATCHLEN 0>
+        <SET FOO <FIRST? ,ROOMS>>
+        <REPEAT ()
+                <COND (<NOT .FOO> <RETURN>)
+                      (T
+                       <SEARCH-LIST .FOO .TBL ,P-SRCALL>
+                       <SET FOO <NEXT? .FOO>>)>>
+        <COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 0>
+               <DO-SL ,LOCAL-GLOBALS 1 1>)>
+        <COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 0>
+               <DO-SL ,ROOMS 1 1>)>
+        <COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 1>
+               <SETG P-MOBY-FOUND <GET .TBL 1>>)>
+        <SETG P-MOBY-FLAG <>>
+        <SETG P-NAM <>>
+        <SETG P-ADJ <>>
+        .LEN>
+
+<GLOBAL P-MOBY-FOUND <>>
+<GLOBAL P-MOBY-FLAG <>>)>
+
+<GLOBAL P-XNAM <>>
+<GLOBAL P-XADJ <>>
+<GLOBAL P-XADJN <>>
+
+<ROUTINE WHICH-PRINT (TLEN LEN TBL "AUX" OBJ RLEN)
+        <SET RLEN .LEN>
+        <TELL "Which ">
+         <COND (<OR ,P-OFLAG ,P-MERGED ,P-AND>
+               <PRINTB <COND (,P-NAM ,P-NAM)
+                             (,P-ADJ ,P-ADJN)
+                             (ELSE ,W?ONE)>>)
+              (ELSE
+               <THING-PRINT <EQUAL? .TBL ,P-PRSO>>)>
+        <TELL " do you mean, ">
+        <REPEAT ()
+                <SET TLEN <+ .TLEN 1>>
+                <SET OBJ <GET .TBL .TLEN>>
+                <TELL "the " D .OBJ>
+                <COND (<EQUAL? .LEN 2>
+                       <COND (<NOT <EQUAL? .RLEN 2>> <TELL ",">)>
+                       <TELL " or ">)
+                      (<G? .LEN 2> <TELL ", ">)>
+                <COND (<L? <SET LEN <- .LEN 1>> 1>
+                       <TELL "?" CR>
+                       <RETURN>)>>>
+
+\f
+<GLOBAL LAST-PSEUDO-LOC <>>
+
+<ROUTINE GLOBAL-CHECK (TBL "AUX" LEN RMG RMGL (CNT 0) OBJ OBITS FOO)
+       <SET LEN <GET .TBL ,P-MATCHLEN>>
+       <SET OBITS ,P-SLOCBITS>
+       <COND (<SET RMG <GETPT ,HERE ,P?GLOBAL>>
+              <SET RMGL <- <PTSIZE .RMG> 1>>
+              <REPEAT ()
+                      <COND (<THIS-IT? <SET OBJ <GETB .RMG .CNT>> .TBL>
+                             <OBJ-FOUND .OBJ .TBL>)>
+                      <COND (<IGRTR? CNT .RMGL> <RETURN>)>>)>
+       <COND (<SET RMG <GETPT ,HERE ,P?PSEUDO>>
+              <SET RMGL <- </ <PTSIZE .RMG> 4> 1>>
+              <SET CNT 0>
+              <REPEAT ()
+                      <COND (<EQUAL? ,P-NAM <GET .RMG <* .CNT 2>>>
+                             <SETG LAST-PSEUDO-LOC ,HERE>
+                             <PUTP ,PSEUDO-OBJECT
+                                   ,P?ACTION
+                                   <GET .RMG <+ <* .CNT 2> 1>>>
+                             <SET FOO
+                                  <BACK <GETPT ,PSEUDO-OBJECT ,P?ACTION> 5>>
+                             <PUT .FOO 0 <GET ,P-NAM 0>>
+                             <PUT .FOO 1 <GET ,P-NAM 1>>
+                             <OBJ-FOUND ,PSEUDO-OBJECT .TBL>
+                             <RETURN>)
+                            (<IGRTR? CNT .RMGL> <RETURN>)>>)>
+       <COND (<EQUAL? <GET .TBL ,P-MATCHLEN> .LEN>
+              <SETG P-SLOCBITS -1>
+              <SETG P-TABLE .TBL>
+              <DO-SL ,GLOBAL-OBJECTS 1 1>
+              <SETG P-SLOCBITS .OBITS>
+              ;<COND (<AND <ZERO? <GET .TBL ,P-MATCHLEN>>
+                          <EQUAL? ,PRSA ,V?LOOK-INSIDE ,V?SEARCH ,V?EXAMINE>>
+                     <DO-SL ,ROOMS 1 1>)>)>>
+
+<ROUTINE DO-SL (OBJ BIT1 BIT2 "AUX" BTS)
+       <COND (<BTST ,P-SLOCBITS <+ .BIT1 .BIT2>>
+              <SEARCH-LIST .OBJ ,P-TABLE ,P-SRCALL>)
+             (T
+              <COND (<BTST ,P-SLOCBITS .BIT1>
+                     <SEARCH-LIST .OBJ ,P-TABLE ,P-SRCTOP>)
+                    (<BTST ,P-SLOCBITS .BIT2>
+                     <SEARCH-LIST .OBJ ,P-TABLE ,P-SRCBOT>)
+                    (T <RTRUE>)>)>>
+
+<CONSTANT P-SRCBOT 2>
+<CONSTANT P-SRCTOP 0>
+<CONSTANT P-SRCALL 1>
+
+<ROUTINE SEARCH-LIST (OBJ TBL LVL "AUX" FLS NOBJ)
+       <COND (<SET OBJ <FIRST? .OBJ>>
+              <REPEAT ()
+                      <COND (<AND <NOT <EQUAL? .LVL ,P-SRCBOT>>
+                                  <GETPT .OBJ ,P?SYNONYM>
+                                  <THIS-IT? .OBJ .TBL>>
+                             <OBJ-FOUND .OBJ .TBL>)>
+                      <COND (<AND <OR <NOT <==? .LVL ,P-SRCTOP>>
+                                      <FSET? .OBJ ,SEARCHBIT>
+                                      <FSET? .OBJ ,SURFACEBIT>>
+                                  <SET NOBJ <FIRST? .OBJ>>>
+                             <COND (%<COND (<OR <==? ,ZORK-NUMBER 4>
+                                                <==? ,ZORK-NUMBER 5>>
+                                            '<OR <FSET? .OBJ ,OPENBIT>
+                                                 <FSET? .OBJ ,TRANSBIT>
+                                                 ,P-MOBY-FLAG>)
+                                           (ELSE
+                                            '<OR <FSET? .OBJ ,OPENBIT>
+                                                 <FSET? .OBJ ,TRANSBIT>>)>
+                                    <SET FLS
+                                         <SEARCH-LIST
+                                          .OBJ
+                                          .TBL
+                                          <COND (<FSET? .OBJ ,SURFACEBIT>
+                                                 ,P-SRCALL)
+                                                (<FSET? .OBJ ,SEARCHBIT>
+                                                 ,P-SRCALL)
+                                                (T ,P-SRCTOP)>>>)>)>
+                      <COND (<SET OBJ <NEXT? .OBJ>>) (T <RETURN>)>>)>>
+
+<ROUTINE OBJ-FOUND (OBJ TBL "AUX" PTR)
+       <SET PTR <GET .TBL ,P-MATCHLEN>>
+       <PUT .TBL <+ .PTR 1> .OBJ>
+       <PUT .TBL ,P-MATCHLEN <+ .PTR 1>>>
+
+<ROUTINE TAKE-CHECK ()
+       <AND <ITAKE-CHECK ,P-PRSO <GETB ,P-SYNTAX ,P-SLOC1>>
+            <ITAKE-CHECK ,P-PRSI <GETB ,P-SYNTAX ,P-SLOC2>>>>
+\f
+<ROUTINE ITAKE-CHECK (TBL IBITS "AUX" PTR OBJ TAKEN)
+        #DECL ((TBL) TABLE (IBITS PTR) FIX (OBJ) OBJECT
+               (TAKEN) <OR FALSE FIX ATOM>)
+        <COND (<AND <SET PTR <GET .TBL ,P-MATCHLEN>>
+                    <OR <BTST .IBITS ,SHAVE>
+                        <BTST .IBITS ,STAKE>>>
+               <REPEAT ()
+                       <COND (<L? <SET PTR <- .PTR 1>> 0> <RETURN>)
+                             (T
+                              <SET OBJ <GET .TBL <+ .PTR 1>>>
+                              <COND (<EQUAL? .OBJ ,IT>
+                                     <COND (<NOT <ACCESSIBLE? ,P-IT-OBJECT>>
+                                            <TELL
+"I don't see what you're referring to." CR>
+                                            <RFALSE>)
+                                           (T
+                                            <SET OBJ ,P-IT-OBJECT>)>)>
+                              <COND (<AND <NOT <HELD? .OBJ>>
+                                          <NOT <EQUAL? .OBJ ,HANDS ,ME>>>
+                                     <SETG PRSO .OBJ>
+                                     <COND (<FSET? .OBJ ,TRYTAKEBIT>
+                                            <SET TAKEN T>)
+                                           (<NOT <EQUAL? ,WINNER ,PLAYER>>
+                                            <SET TAKEN <>>)
+                                           (<AND <BTST .IBITS ,STAKE>
+                                                 <EQUAL? <ITAKE <>> T>>
+                                            <SET TAKEN <>>)
+                                           (T <SET TAKEN T>)>
+                                     <COND (<AND .TAKEN
+                                                 <BTST .IBITS ,SHAVE>
+                                                 <EQUAL? ,WINNER
+                                                         ,PLAYER>>
+                                            <COND (<EQUAL? .OBJ
+                                                           ,NOT-HERE-OBJECT>
+                                                   <TELL
+"You don't have that!" CR>
+                                                   <RFALSE>)>
+                                            <TELL "You don't have ">
+                                            <COND (<G? <GET .TBL ,P-MATCHLEN>
+                                                       1>
+                                                   <TELL "all those things">)
+                                                  (<EQUAL? .OBJ
+                                                           ,NOT-HERE-OBJECT>
+                                                   <TELL "that">)
+                                                  (T
+                                                   <TELL "the " D .OBJ>
+                                                   <THIS-IS-IT .OBJ>)>
+                                            <TELL "." CR>
+                                            <RFALSE>)
+                                           (<AND <NOT .TAKEN>
+                                                 <EQUAL? ,WINNER ,PLAYER>>
+                                            <TELL "(Taken)" CR>)>)>)>>)
+              (T)>>
+
+<ROUTINE MANY-CHECK ("AUX" (LOSS <>) TMP)
+       <COND (<AND <G? <GET ,P-PRSO ,P-MATCHLEN> 1>
+                   <NOT <BTST <GETB ,P-SYNTAX ,P-SLOC1> ,SMANY>>>
+              <SET LOSS 1>)
+             (<AND <G? <GET ,P-PRSI ,P-MATCHLEN> 1>
+                   <NOT <BTST <GETB ,P-SYNTAX ,P-SLOC2> ,SMANY>>>
+              <SET LOSS 2>)>
+       <COND (.LOSS
+              <TELL "You can't use multiple ">
+              <COND (<EQUAL? .LOSS 2> <TELL "in">)>
+              <TELL "direct objects with \"">
+              <SET TMP <GET ,P-ITBL ,P-VERBN>>
+              <COND (<ZERO? .TMP> <TELL "tell">)
+                    (<OR ,P-OFLAG ,P-MERGED>
+                     <PRINTB <GET .TMP 0>>)
+                    (T
+                     <WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>)>
+              <TELL "\"." CR>
+              <RFALSE>)
+             (T)>>
+
+<ROUTINE ZMEMQ (ITM TBL "OPTIONAL" (SIZE -1) "AUX" (CNT 1))
+       <COND (<NOT .TBL> <RFALSE>)>
+       <COND (<NOT <L? .SIZE 0>> <SET CNT 0>)
+             (ELSE <SET SIZE <GET .TBL 0>>)>
+       <REPEAT ()
+               <COND (<EQUAL? .ITM <GET .TBL .CNT>>
+                      <RETURN <REST .TBL <* .CNT 2>>>)
+                     (<IGRTR? CNT .SIZE> <RFALSE>)>>>
+\f
+<ROUTINE ZMEMQB (ITM TBL SIZE "AUX" (CNT 0))
+       <REPEAT ()
+               <COND (<EQUAL? .ITM <GETB .TBL .CNT>>
+                      <RTRUE>)
+                     (<IGRTR? CNT .SIZE>
+                      <RFALSE>)>>>
+
+<GLOBAL ALWAYS-LIT <>>
+
+<ROUTINE LIT? (RM "OPTIONAL" (RMBIT T) "AUX" OHERE (LIT <>))
+       <COND (<AND ,ALWAYS-LIT <EQUAL? ,WINNER ,PLAYER>>
+              <RTRUE>)>
+       <SETG P-GWIMBIT ,ONBIT>
+       <SET OHERE ,HERE>
+       <SETG HERE .RM>
+       <COND (<AND .RMBIT
+                   <FSET? .RM ,ONBIT>>
+              <SET LIT T>)
+             %<COND (<==? ,ZORK-NUMBER 4>
+                     '(<AND .RMBIT
+                            <NOT <G? ,TOD ,NIGHTFALL>>
+                            <FSET? .RM ,LIGHTBIT>>
+                       <SET LIT T>))
+                    (ELSE '(<NULL-F> <RTRUE>))>
+             (T
+              <PUT ,P-MERGE ,P-MATCHLEN 0>
+              <SETG P-TABLE ,P-MERGE>
+              <SETG P-SLOCBITS -1>
+              <COND (<EQUAL? .OHERE .RM>
+                     <DO-SL ,WINNER 1 1>
+                     <COND (<AND <NOT <EQUAL? ,WINNER ,PLAYER>>
+                                 <IN? ,PLAYER .RM>>
+                            <DO-SL ,PLAYER 1 1>)>)>
+              <DO-SL .RM 1 1>
+              <COND (<G? <GET ,P-TABLE ,P-MATCHLEN> 0> <SET LIT T>)>)>
+       <SETG HERE .OHERE>
+       <SETG P-GWIMBIT 0>
+       .LIT>
+
+<COND (<==? ,ZORK-NUMBER 4>
+
+<ROUTINE PRSO-PRINT ("AUX" PTR)
+        <COND (<OR ,P-MERGED
+                   <EQUAL? <GET <SET PTR <GET ,P-ITBL ,P-NC1>> 0> ,W?IT>>
+               <TELL " " D ,PRSO>)
+              (T <BUFFER-PRINT .PTR <GET ,P-ITBL ,P-NC1L> <>>)>>
+
+<ROUTINE PRSI-PRINT ("AUX" PTR)
+        <COND (<OR ,P-MERGED
+                   <EQUAL? <GET <SET PTR <GET ,P-ITBL ,P-NC2>> 0> ,W?IT>>
+               <TELL " " D ,PRSO>)
+              (T <BUFFER-PRINT .PTR <GET ,P-ITBL ,P-NC2L> <>>)>>
+)>
+
+;"former CRUFTY routine, re-written by SWG"
+
+<ROUTINE THIS-IT? (OBJ TBL "AUX" SYNS)
+ <COND (<FSET? .OBJ ,INVISIBLE> <RFALSE>)
+       (<AND ,P-NAM
+            <NOT <ZMEMQ ,P-NAM
+                        <SET SYNS <GETPT .OBJ ,P?SYNONYM>>
+                        <- </ <PTSIZE .SYNS> 2> 1>>>>
+       <RFALSE>)
+       (<AND ,P-ADJ
+            <OR <NOT <SET SYNS <GETPT .OBJ ,P?ADJECTIVE>>>
+                <NOT <ZMEMQB ,P-ADJ .SYNS <- <PTSIZE .SYNS> 1>>>>>
+       <RFALSE>)
+       (<AND <NOT <ZERO? ,P-GWIMBIT>> <NOT <FSET? .OBJ ,P-GWIMBIT>>>
+       <RFALSE>)>
+ <RTRUE>>
+
+<ROUTINE ACCESSIBLE? (OBJ "AUX" (L <LOC .OBJ>)) ;"can player TOUCH object?"
+        ;"revised 5/2/84 by SEM and SWG"
+        <COND (<FSET? .OBJ ,INVISIBLE>
+               <RFALSE>)
+              %<COND (<==? ,ZORK-NUMBER 5>
+                      '(<EQUAL? .OBJ ,PSEUDO-OBJECT>
+                        <COND (<EQUAL? ,LAST-PSEUDO-LOC ,HERE>
+                               <RTRUE>)
+                              (T
+                               <RFALSE>)>))
+                     (ELSE
+                      '(<NULL-F> <RTRUE>))>
+              (<NOT .L>
+               <RFALSE>)
+              (<EQUAL? .L ,GLOBAL-OBJECTS>
+               <RTRUE>)
+              (<AND <EQUAL? .L ,LOCAL-GLOBALS>
+                    <GLOBAL-IN? .OBJ ,HERE>>
+               <RTRUE>)
+              (<NOT <EQUAL? <META-LOC .OBJ> ,HERE <LOC ,WINNER>>>
+               <RFALSE>)
+              (<EQUAL? .L ,WINNER ,HERE <LOC ,WINNER>>
+               <RTRUE>)
+              (<AND <FSET? .L ,OPENBIT>
+                    <ACCESSIBLE? .L>>
+               <RTRUE>)
+              (T
+               <RFALSE>)>>
+
+<ROUTINE META-LOC (OBJ)
+        <REPEAT ()
+                <COND (<NOT .OBJ>
+                       <RFALSE>)
+                      (<IN? .OBJ ,GLOBAL-OBJECTS>
+                       <RETURN ,GLOBAL-OBJECTS>)>
+                <COND (<IN? .OBJ ,ROOMS>
+                       <RETURN .OBJ>)
+                      (T
+                       <SET OBJ <LOC .OBJ>>)>>>
diff --git a/guild.zap b/guild.zap
new file mode 100644 (file)
index 0000000..a160bff
--- /dev/null
+++ b/guild.zap
@@ -0,0 +1,609 @@
+
+
+       .FUNCT  BED-F,RARG=0
+       EQUAL?  RARG,M-BEG \?ELS5
+       EQUAL?  PRSA,V?WALK \?ELS10
+       CALL    NOT-GOING-ANYWHERE,BED
+       RSTACK  
+?ELS10:        EQUAL?  PRSA,V?TAKE \FALSE
+       CALL    HELD?,PRSO
+       ZERO?   STACK \FALSE
+       EQUAL?  PRSO,GLOBAL-SLEEP /FALSE
+       EQUAL?  PRSO,GRUE,ME,BED /FALSE
+       IN?     PRSO,BED /FALSE
+       PRINTR  "You can't reach it from the bed."
+?ELS5: ZERO?   RARG \FALSE
+       EQUAL?  PRSA,V?CLOSE,V?OPEN \?ELS28
+       PRINTR  "Huh?"
+?ELS28:        EQUAL?  PRSA,V?WALK-TO \?ELS32
+       CALL    PERFORM,V?WALK-TO,GLOBAL-SLEEP
+       RTRUE   
+?ELS32:        EQUAL?  PRSA,V?LIE-DOWN,V?CLIMB-ON \FALSE
+       CALL    PERFORM,V?BOARD,PRSO
+       RTRUE   
+
+
+       .FUNCT  GLOBAL-BED-F
+       EQUAL?  GLOBAL-BED,PRSO \?ELS5
+       SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,BED,PRSI
+       RTRUE   
+?ELS5: SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,PRSO,BED
+       RTRUE   
+
+
+       .FUNCT  BELBOZ-QUARTERS-F,RARG
+       EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "The personal chamber of Belboz, who presides over the Circle of Enchanters, is appointed with a beautiful woven wall hanging"
+       IN?     MORGIA-PLANT,HERE \?CND8
+       PRINTI  ", an exotic morgia plant,"
+?CND8: PRINTR  " and a wide darkwood desk crafted by the artisans of Gurth. The hallway lies to the east."
+
+
+       .FUNCT  PERCH-PSEUDO
+       EQUAL?  PRSA,V?CLIMB-ON \FALSE
+       PRINTR  "I'd recommend a good doctor, but we need the eggs."
+
+
+       .FUNCT  PARROT-F
+       EQUAL?  PRSA,V?TAKE \FALSE
+       PRINTR  "The parrot hops to the other end of the perch."
+
+
+       .FUNCT  I-PARROT
+       IN?     PARROT,HERE \FALSE
+       RANDOM  100
+       LESS?   40,STACK /FALSE
+       CRLF    
+       PRINTI  """Squawk! "
+       CALL    PICK-ONE,PARROTISMS
+       PRINT   STACK
+       PRINTR  " Squawk!"""
+
+
+       .FUNCT  BELBOZ-DESK-F
+       EQUAL?  PRSA,V?EXAMINE \?ELS5
+       PRINTI  "The desk has one drawer which is "
+       FSET?   DESK-DRAWER,OPENBIT \?ELS10
+       PRINTI  "open"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "closed"
+?CND8: PRINTI  "."
+       CRLF    
+       FIRST?  PRSO \TRUE
+       RFALSE  
+?ELS5: EQUAL?  PRSA,V?SEARCH \?ELS27
+       FSET?   DESK-DRAWER,OPENBIT /?ELS27
+       FIRST?  DESK-DRAWER \?ELS27
+       PRINTI  "You open the desk drawer and find "
+       CALL    PRINT-CONTENTS,DESK-DRAWER
+       FSET    DESK-DRAWER,OPENBIT
+       PRINTR  "."
+?ELS27:        EQUAL?  PRSA,V?REZROV,V?OPEN,V?CLOSE /?THN36
+       EQUAL?  PRSA,V?LOOK-INSIDE,V?REACH-IN \?ELS35
+?THN36:        SET     'PERFORMING-SPELL,TRUE-VALUE
+       CALL    PERFORM,PRSA,DESK-DRAWER
+       RTRUE   
+?ELS35:        EQUAL?  PRSA,V?TAKE \?ELS39
+       EQUAL?  BELBOZ-DESK,PRSI \?ELS39
+       FIRST?  DESK-DRAWER \?ELS39
+       CALL    PERFORM,V?TAKE,PRSO,DESK-DRAWER
+       FIRST?  BELBOZ-DESK \TRUE
+       RFALSE  
+?ELS39:        EQUAL?  PRSA,V?PUT \FALSE
+       EQUAL?  PRSI,BELBOZ-DESK \FALSE
+       CALL    PERFORM,V?PUT,PRSO,DESK-DRAWER
+       RTRUE   
+
+
+       .FUNCT  TINY-BOX-F
+       EQUAL?  PRSA,V?EXAMINE \?ELS5
+       PRINTI  "There is writing on the lid of the box."
+       CRLF    
+       CALL    PERFORM,V?READ,PRSO
+       RTRUE   
+?ELS5: EQUAL?  PRSA,V?READ \FALSE
+       CALL    FIXED-FONT-ON
+       PRINTI  "
+""    MAGIC AMULET
+
+The closer this amulet is to
+its owner, the brighter it may
+glow. Ideal for leaving with
+your loved ones if you go on
+a long and hazardous journey.
+
+This amulet is sensitized to
+-> BELBOZ THE NECROMANCER
+
+Another fine product of the
+Frobozz Magic Amulet Company."""
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  MAGIC-AMULET-F
+       EQUAL?  PRSA,V?EXAMINE \?ELS5
+       PRINTI  "A blue jewel hangs from a long golden chain. The jewel is "
+       CALL    AMULET-GLOWS
+       PRINTR  "."
+?ELS5: EQUAL?  PRSA,V?RESEARCH \FALSE
+       PRINTR  "The Amulet of Aggthora was a legendary jewel renowned for its powers of augury."
+
+
+       .FUNCT  AMULET-DESCFCN,RARG
+       PRINTI  "There is an amulet here. The amulet's jewel is "
+       CALL    AMULET-GLOWS
+       PRINTR  "."
+
+
+       .FUNCT  AMULET-GLOWS
+       CALL    IN-GUILD-HALL?
+       ZERO?   STACK /?ELS5
+       PRINTI  "dark"
+       RTRUE   
+?ELS5: CALL    IN-MAZE-AREA?
+       ZERO?   STACK /?ELS9
+       PRINTI  "glowing"
+       RTRUE   
+?ELS9: CALL    IN-CRATER-AREA?
+       ZERO?   STACK /?ELS13
+       PRINTI  "glowing brightly"
+       RTRUE   
+?ELS13:        CALL    IN-COAL-MINE?
+       ZERO?   STACK /?ELS17
+       PRINTI  "glowing very brightly"
+       RTRUE   
+?ELS17:        CALL    IN-END-GAME?
+       ZERO?   STACK /?ELS21
+       PRINTI  "pulsing with flashes of brilliant light"
+       RTRUE   
+?ELS21:        PRINTI  "glowing dimly"
+       RTRUE   
+
+
+       .FUNCT  IN-GUILD-HALL?,X=0
+       ZERO?   X \?CND1
+       SET     'X,HERE
+?CND1: EQUAL?  X,HALLWAY-1,HALLWAY-2,CHAMBER-OF-THE-CIRCLE /TRUE
+       EQUAL?  X,YOUR-QUARTERS,BELBOZ-QUARTERS,LOBBY /TRUE
+       EQUAL?  X,FROBAR-QUARTERS,HELISTAR-QUARTERS /TRUE
+       EQUAL?  X,STORE-ROOM,LIBRARY,CELLAR /TRUE
+       EQUAL?  X,APPRENTICE-QUARTERS,SERVANT-QUARTERS \FALSE
+       RTRUE   
+
+
+       .FUNCT  IN-COAL-MINE?
+       EQUAL?  HERE,COAL-BIN-ROOM,DIAL-ROOM,SHAFT-BOTTOM /TRUE
+       EQUAL?  HERE,SHAFT-TOP,TOP-OF-CHUTE,SLANTED-ROOM /TRUE
+       EQUAL?  HERE,COAL-MINE-1,COAL-MINE-2,COAL-MINE-3 \FALSE
+       RTRUE   
+
+
+       .FUNCT  IN-MAZE-AREA?
+       EQUAL?  HERE,TOLL-GATE,END-OF-HIGHWAY,HOLLOW /TRUE
+       EQUAL?  HERE,OUTSIDE-GLASS-DOOR,GLASS-MAZE,STORE /TRUE
+       EQUAL?  HERE,ENTRANCE-HALL,STONE-HUT,OUTSIDE-STORE \FALSE
+       RTRUE   
+
+
+       .FUNCT  IN-CRATER-AREA?
+       EQUAL?  HERE,HIGHWAY,BEND,EDGE-OF-CRATER /TRUE
+       EQUAL?  HERE,CRATER,WINDING-TUNNEL,HALL-OF-CARVINGS /TRUE
+       EQUAL?  HERE,EDGE-OF-CHASM,BARE-PASSAGE,SOOTY-ROOM /TRUE
+       EQUAL?  HERE,ELBOW-ROOM,TREE-ROOM,PARK-ENTRANCE /TRUE
+       EQUAL?  HERE,EAST-END-OF-MIDWAY,FLUME,HAUNTED-HOUSE /TRUE
+       EQUAL?  HERE,WEST-END-OF-MIDWAY,ROLLER-COASTER,ARCADE /TRUE
+       EQUAL?  HERE,CASINO \FALSE
+       RTRUE   
+
+
+       .FUNCT  IN-END-GAME?
+       EQUAL?  HERE,OCEAN-NORTH,OCEAN-SOUTH,BELBOZ-HIDEOUT /TRUE
+       EQUAL?  HERE,MOUTH-OF-RIVER,GRUE-LAIR,MAMMOTH-CAVERN /TRUE
+       EQUAL?  HERE,CHAMBER-OF-LIVING-DEATH,COVE,LAGOON-FLOOR /TRUE
+       EQUAL?  HERE,HALL-OF-ETERNAL-PAIN,LAGOON \FALSE
+       RTRUE   
+
+
+       .FUNCT  JOURNAL-F
+       EQUAL?  PRSA,V?LOOK-INSIDE,V?EXAMINE,V?READ \?ELS5
+       FSET?   JOURNAL,OPENBIT \?ELS10
+       PRINTI  "You skim through the pages of the journal, a combination diary and notebook. Most of the notations, written in Belboz's familiar flowing script, deal with meetings of the Circle and business of the Guild.
+
+There is one interesting entry toward the end of the book. Belboz refers to an ancient and evil force known simply as Jeearr, a demon whose powers could endanger the Circle and possibly the entire kingdom. He has decided to conduct some dangerous exploratory experiments, operating alone to shield the Circle from the perils involved.
+
+The last three entries are strange and frightening -- written in a hand quite different from that of Belboz, and in a language totally unfamiliar to you.
+
+On the inside cover is an inscription, written in a light script, which reads ""Current code: "
+       GET     CODE-TABLE,CODE-NUMBER
+       PRINT   STACK
+       PRINTR  """."
+?ELS10:        PRINTR  "It's closed and sealed with a lock."
+?ELS5: EQUAL?  PRSA,V?REZROV,V?UNLOCK,V?OPEN \FALSE
+       FSET?   JOURNAL,OPENBIT \?ELS23
+       PRINTR  "The journal is already open!"
+?ELS23:        EQUAL?  PRSA,V?REZROV \?ELS27
+       PRINTR  "The journal seems to bear a spell protecting it against the simple rezrov spell."
+?ELS27:        ZERO?   PRSI \?CND32
+       IN?     KEY,PROTAGONIST \?ELS37
+       SET     'PRSI,KEY
+       PRINTI  "(with the key)"
+       CRLF    
+       JUMP    ?CND32
+?ELS37:        SET     'PRSI,HANDS
+?CND32:        EQUAL?  PRSI,KEY \?ELS46
+       FSET    JOURNAL,OPENBIT
+       PRINTR  "The journal springs open."
+?ELS46:        PRINTI  "You can't unlock it with"
+       CALL    ARTICLE,PRSI
+       PRINTR  "."
+
+
+       .FUNCT  WHEEL-F
+       EQUAL?  PRSA,V?EXAMINE \?ELS5
+       PRINTI  "Like most infotaters, this one has several windows and a rotating data wheel. It is leather-bound and beautifully illustrated. "
+       CALL    INFOTATER-NOTE
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?READ \?ELS9
+       PRINTI  "The infotater has entries on a dozen native beasts. "
+       CALL    INFOTATER-NOTE
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?SPIN,V?TURN \?ELS13
+       PRINTR  "Refer to the infotater in your SORCERER package."
+?ELS13:        EQUAL?  PRSA,V?RESEARCH \FALSE
+       PRINTR  "The infotater, which popular legends say was invented by Entharion the Wise, is the best way to store data ever discovered."
+
+
+       .FUNCT  INFOTATER-NOTE
+       PRINTR  "(NOTE: This is the infotater included in your game package.)"
+
+
+       .FUNCT  WALL-HANGING-F
+       EQUAL?  PRSA,V?LOOK-UNDER,V?LOOK-BEHIND,V?MOVE /?THN6
+       EQUAL?  PRSA,V?RAISE,V?SHAKE,V?RUB \?ELS5
+?THN6: FSET?   KEY,TOUCHBIT /?ELS12
+       MOVE    KEY,HERE
+       CALL    THIS-IS-IT,KEY
+       FSET    KEY,TOUCHBIT
+       ADD     SCORE,15 >SCORE
+       PRINTR  "As you move the tapestry, a key falls out from behind it and lands on the floor."
+?ELS12:        PRINTR  "Nope, no more keys."
+?ELS5: EQUAL?  PRSA,V?UNTIE,V?TAKE \?ELS20
+       PRINTR  "It looks too well fastened to remove from the wall."
+?ELS20:        EQUAL?  PRSA,V?EXAMINE \FALSE
+       PRINTR  "It is a beautiful piece of local handiwork, given to Belboz by the grateful townspeople after his (admittedly showy) pyrotechnical destruction of the evil giant Amathradonis. The hanging is affixed to the wall at its upper corners."
+
+
+       .FUNCT  MORGIA-PLANT-F
+       EQUAL?  PRSA,V?MEEF \?ELS5
+       MOVE    MORGIA-PLANT,DIAL
+       PRINTR  "The morgia plant, particularly susceptible to the meef spell, shrivels up and vanishes."
+?ELS5: EQUAL?  PRSA,V?TAKE \?ELS9
+       PRINTR  "The plant is so heavy you succeed only in budging it a few inches."
+?ELS9: EQUAL?  PRSA,V?EAT \?ELS13
+       PRINTR  "Morgias taste terrible; besides, Belboz wouldn't like someone munching on his favorite plant."
+?ELS13:        EQUAL?  PRSA,V?RESEARCH \FALSE
+       PRINTR  "A beautiful and exotic plant, the morgia is well-known for its susceptibility to magic spells."
+
+
+       .FUNCT  HALLWAY-1-F,RARG
+       EQUAL?  RARG,M-LOOK \FALSE
+       CALL    HALLWAY-DESC
+       PRINTI  "A heavy wooden door, currently "
+       FSET?   CHAMBER-DOOR,OPENBIT \?ELS10
+       PRINTI  "open"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "closed"
+?CND8: PRINTR  ", leads north."
+
+
+       .FUNCT  HALLWAY-2-F,RARG
+       EQUAL?  RARG,M-LOOK \FALSE
+       CALL    HALLWAY-DESC
+       PRINTR  "A large marble archway to the south leads into an open area."
+
+
+       .FUNCT  HALLWAY-DESC
+       PRINTI  "Rooms lie to the east and west from this north-south corridor. "
+       RTRUE   
+
+
+       .FUNCT  CHAMBER-OF-THE-CIRCLE-F,RARG
+       EQUAL?  RARG,M-LOOK \FALSE
+       PRINTI  "The meeting place of the Circle of Enchanters is a large, round room with a high domed ceiling. A table occupies the center of the room. Engraved on the wall is a list of tenets, the Guild's code of honor. The only door, at the southernmost point of the perimeter, is "
+       FSET?   CHAMBER-DOOR,OPENBIT \?ELS10
+       PRINTI  "open"
+       JUMP    ?CND8
+?ELS10:        PRINTI  "closed"
+?CND8: PRINTR  "."
+
+
+       .FUNCT  TABLE-PSEUDO
+       EQUAL?  PRSA,V?CLIMB-ON,V?PUT-ON \?ELS5
+       SET     'TABLE-WARNING,TRUE-VALUE
+       PRINTR  "A warning nymph appears, floating over the table. ""The servants just finished waxing the table, and it's still wet."" With a sly grin, the nymph vanishes."
+?ELS5: ZERO?   TABLE-WARNING /FALSE
+       EQUAL?  PRSA,V?PULVER \FALSE
+       PRINTR  "That would cause the wax to dry dull and yellowish!"
+
+
+       .FUNCT  MARBLE-PSEUDO
+       RFALSE  
+
+
+       .FUNCT  I-MAILMAN
+       MOVE    MAGAZINE,MAILBOX
+       FCLEAR  MAILBOX,OPENBIT
+       IN?     MATCHBOOK,MAILBOX \?CND1
+       MOVE    VILSTU-VIAL,MAILBOX
+       MOVE    MATCHBOOK,DIAL
+?CND1: EQUAL?  HERE,LOBBY \?ELS8
+       SET     'MAILMAN-FOLLOW,TRUE-VALUE
+       CALL    QUEUE,I-MAILMAN-FOLLOW,1
+       PUT     STACK,0,1
+       CRLF    
+       PRINTR  "A member of the Messengers Guild walks up and puts something in the receptacle. He closes it, and rings the doorbell. Noticing you, he gives a friendly wave before departing."
+?ELS8: CALL    IN-GUILD-HALL?
+       ZERO?   STACK /FALSE
+       CRLF    
+       PRINTR  "The Guild Hall doorbell chimes."
+
+
+       .FUNCT  I-MAILMAN-FOLLOW
+       SET     'MAILMAN-FOLLOW,FALSE-VALUE
+       RFALSE  
+
+
+       .FUNCT  MAGAZINE-F
+       EQUAL?  PRSA,V?READ,V?LOOK-INSIDE,V?OPEN \FALSE
+       PRINTI  "This month's cover story is about Belboz! Other stories relate the explosion of spell scroll manufacturers, and the coming shakedown in the magic potion industry. The address label on the cover reads:
+
+"
+       CALL    FIXED-FONT-ON
+       PRINTI  "    ""Z5 ACCAR256 4-964
+    Hall of the Guild of Enchanters
+    Village of Accardi-By-The-Sea
+    Land of Frobozz"""
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  VILSTU-VIAL-F
+       EQUAL?  PRSA,V?READ \FALSE
+       CALL    FIXED-FONT-ON
+       PRINTI  "
+       ""VILSTU POTION
+(obviate need for breathing)"""
+       CRLF    
+       CALL    FIXED-FONT-OFF
+       RSTACK  
+
+
+       .FUNCT  VILSTU-POTION-F
+       EQUAL?  PRSA,V?DRINK,V?EAT \?ELS5
+       IN?     VILSTU-VIAL,PROTAGONIST /?ELS5
+       CALL    POTION-POUR,VILSTU-VIAL
+       RSTACK  
+?ELS5: EQUAL?  PRSA,V?RESEARCH \?ELS9
+       CALL    READ-ABOUT-POTIONS,3
+       RSTACK  
+?ELS9: EQUAL?  PRSA,V?DRINK,V?EAT \?ELS11
+       MOVE    VILSTU-POTION,DIAL
+       ZERO?   UNDER-INFLUENCE /?CND12
+       CALL    TWO-POTIONS
+       RTRUE   
+?CND12:        SET     'UNDER-INFLUENCE,VILSTU-POTION
+       CALL    QUEUE,I-BREATHE,19
+       PUT     STACK,0,1
+       SET     'VILSTUED,TRUE-VALUE
+       EQUAL?  HERE,COAL-BIN-ROOM,DIAL-ROOM \?CND16
+       CALL    INT,I-SUFFOCATE
+       PUT     STACK,0,0
+       CALL    QUEUE,I-OLDER-SELF,1
+       PUT     STACK,0,1
+?CND16:        PRINTR  "The orange potion tasted like pepper, and made your nose tingle."
+?ELS11:        EQUAL?  PRSA,V?DROP \?ELS22
+       CALL    PERFORM,V?POUR,PRSO,PRSI
+       RTRUE   
+?ELS22:        EQUAL?  PRSA,V?POUR \FALSE
+       EQUAL?  PRSO,VILSTU-POTION \FALSE
+       CALL    POTION-POUR,VILSTU-VIAL
+       RSTACK  
+
+
+    &n