]> github.com/historicalsource and other repositories - zork-1977-source.git/commitdiff
initial commit
authorjoe <jfcarrano@gmail.com>
Tue, 5 May 2020 19:13:32 +0000 (15:13 -0400)
committerjoe <jfcarrano@gmail.com>
Tue, 5 May 2020 19:13:32 +0000 (15:13 -0400)
24 files changed:
README.md [new file with mode: 0644]
codemeta.json [new file with mode: 0644]
tree.txt [new file with mode: 0644]
zork/act2.27 [new file with mode: 0644]
zork/dung.56 [new file with mode: 0644]
zork/lcf/act1.37 [new file with mode: 0644]
zork/lcf/act1.38 [new file with mode: 0644]
zork/lcf/act2z.27 [new file with mode: 0644]
zork/lcf/act3.13 [new file with mode: 0644]
zork/lcf/defs.63 [new file with mode: 0644]
zork/lcf/dungz.56 [new file with mode: 0644]
zork/lcf/makstr.7 [new file with mode: 0644]
zork/lcf/makstr.nbin [new file with mode: 0644]
zork/lcf/nact2.nbin [new file with mode: 0644]
zork/lcf/ndefs.nbin [new file with mode: 0644]
zork/lcf/nnp.nbin [new file with mode: 0644]
zork/lcf/np.92 [new file with mode: 0644]
zork/lcf/np.93 [new file with mode: 0644]
zork/lcf/nrooms.nbin [new file with mode: 0644]
zork/lcf/rooms.98 [new file with mode: 0644]
zork/lcf/rooms.99 [new file with mode: 0644]
zork/madman/madadv.help [new file with mode: 0644]
zork/madman/madadv.save [new file with mode: 0644]
zork/madman/omadad.save [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..751ec44
--- /dev/null
+++ b/README.md
@@ -0,0 +1,27 @@
+# Zork source code, 1977\r
+This repository contains the source code for a 1977 version of [Zork](https://en.wikipedia.org/wiki/Zork), an interactive fiction game created at MIT by Tim Anderson, Marc Blank, Bruce Daniels, and Dave Lebling. The files are a part of the [Massachusetts Institute of Technology, Tapes of Tech Square (ToTS) collection](https://archivesspace.mit.edu/repositories/2/resources/1265) at the MIT Libraries Department of Distinctive Collections (DDC).\r
+## File organization and details\r
+### [zork](../zork)\r
+The files within this directory are the Zork specific files from the ```100068.tap``` tape image file within the ```/tots/recovered/vol7``` directory of the [ToTS collection](https://archivesspace.mit.edu/repositories/2/resources/1265). Most files are written in the MDL programming language and were originally created on a PDP-10 timeshare computer running the ITS operating system.\r
+\r
+The files were extracted from the tape image using the [itstar program](https://github.com/PDP-10/itstar). The filenames have been adapted to Unix conventions, as per the itstar translation. The original filename syntax would be like, ```LCF; ACT1 37```, for example. All files have been placed into this artificial zork directory for organizational purposes.\r
+\r
+The [```lcf```](../zork/lcf) and [```madman```](../zork/madman) directories contain the source code for the game.\r
+\r
+The [```act2.27```](../zork/act.27) and [```dung.56```](../zork/dungz.56) files outside of the two main directories, are the decrypted versions of [```act2z.26```](../zork/lcf/) and [```dungz.56```](../zork/lcf/dungz.56). The decrypted versions were created recently and added to this directory by DDC digital archivist, Joe Carrano, for researcher ease of access.  \r
+\r
+Files with extensions ```.nbin``` and ```.save``` are binary compiled files.\r
+\r
+There was a ```zork.log``` file within the [```madman```](../zork/madman) directory that detailed who played Zork at the time of creation. DDC excluded this file from public release to protect the privacy of those named.\r
+\r
+### [codemeta.json](../codemeta.json)\r
+This file is metadata about the Zork files, using the [CodeMeta Project](https://codemeta.github.io/) schema.\r
+### [README.md](../README.md)\r
+This file, the readme detailing the content and context for this repository.\r
+### [tree.txt](../tree.txt)\r
+A file tree listing the files in the [```zork```](../zork) directory showing the original file timestamps as extracted from the tape image. \r
+\r
+## Preferred Citation\r
+Massachusetts Institute of Technology, Tapes of Tech Square (ToTS) collection, MC-0741, Zork source code, 1977, [filename]. Massachusetts Institute of Technology, Department of Distinctive Collections, Cambridge, Massachusetts.\r
+## Acknowledgements\r
+Thanks to [Lars Brinkhoff](https://github.com/larsbrinkhoff) for help with identifying these files and with extracting them using the itstar program mentioned above.\r
diff --git a/codemeta.json b/codemeta.json
new file mode 100644 (file)
index 0000000..ec7fb6b
--- /dev/null
@@ -0,0 +1,43 @@
+{\r
+    "@context": "https://doi.org/10.5063/schema/codemeta-2.0",\r
+    "@type": "SoftwareSourceCode",\r
+    "codeRepository": "https://github.com/MITDDC/zork",\r
+    "dateCreated": "1977-12-16",\r
+    "name": "Zork",\r
+    "description": "1977 version of Zork, an interactive fiction game created at MIT by Tim Anderson, Marc Blank, Bruce Daniels, and Dave Lebling.",\r
+    "applicationCategory": "Game",\r
+    "developmentStatus": "unsupported",\r
+    "isPartOf": "https://archivesspace.mit.edu/repositories/2/resources/1265",\r
+    "keywords": [\r
+        "Interactive Fiction",\r
+        "Computer Science"\r
+    ],\r
+    "programmingLanguage": [\r
+        "MDL"\r
+    ],\r
+    "operatingSystem": [\r
+        "ITS"\r
+    ],\r
+    "author": [\r
+        {\r
+            "@type": "Person",\r
+            "givenName": "Tim",\r
+            "familyName": "Anderson"\r
+        },\r
+        {\r
+            "@type": "Person",\r
+            "givenName": "Marc",\r
+            "familyName": "Blank"\r
+        },\r
+        {\r
+            "@type": "Person",\r
+            "givenName": "Bruce",\r
+            "familyName": "Daniels"\r
+        },\r
+        {\r
+            "@type": "Person",\r
+            "givenName": "Dave",\r
+            "familyName": "Lebling"\r
+        }\r
+    ]\r
+}\r
diff --git a/tree.txt b/tree.txt
new file mode 100644 (file)
index 0000000..464efcd
--- /dev/null
+++ b/tree.txt
@@ -0,0 +1,30 @@
+.
+├── [May  1 16:09]  codemeta.json
+├── [May  1 15:16]  README.md
+├── [May  5 14:19]  tree.txt
+└── [May  5 14:14]  zork
+    ├── [Apr 16 14:43]  act2.27
+    ├── [Apr 16 14:44]  dung.56
+    ├── [Apr 16 14:39]  lcf
+    │   ├── [Dec 10  1977]  act1.37
+    │   ├── [Dec 15  1977]  act1.38
+    │   ├── [Dec 12  1977]  act2z.27
+    │   ├── [Dec 10  1977]  act3.13
+    │   ├── [Dec 14  1977]  defs.63
+    │   ├── [Dec 12  1977]  dungz.56
+    │   ├── [Dec 14  1977]  makstr.7
+    │   ├── [Dec 14  1977]  makstr.nbin
+    │   ├── [Dec 12  1977]  nact2.nbin
+    │   ├── [Dec 14  1977]  ndefs.nbin
+    │   ├── [Dec 15  1977]  nnp.nbin
+    │   ├── [Dec 14  1977]  np.92
+    │   ├── [Dec 14  1977]  np.93
+    │   ├── [Dec 14  1977]  nrooms.nbin
+    │   ├── [Dec 12  1977]  rooms.98
+    │   └── [Dec 13  1977]  rooms.99
+    └── [May  5 14:14]  madman
+        ├── [Dec 14  1977]  madadv.help
+        ├── [Dec 12  1977]  madadv.save
+        └── [Dec  4  1977]  omadad.save
+
+3 directories, 24 files
diff --git a/zork/act2.27 b/zork/act2.27
new file mode 100644 (file)
index 0000000..476de53
--- /dev/null
@@ -0,0 +1,794 @@
+\f\f
+
+<DEFINE BOOM-ROOM ("AUX" (DUMMY? <>) (PRSACT <1 ,PRSVEC>) (WIN ,WINNER) O)
+    #DECL ((DUMMY?) <OR ATOM FALSE> (PRSACT) VERB (WIN) ADV (O) OBJECT)
+    <COND (<OR <==? <VNAME .PRSACT> WALK-IN!-WORDS>
+              <AND <==? <VNAME .PRSACT> ON!-WORDS>
+                   <SET DUMMY? T>>>
+          <COND (<OR <AND <MEMQ <SET O <FIND-OBJ "CANDL">> <AOBJS .WIN>>
+                          <1? <OLIGHT? .O>>>
+                     <AND <MEMQ <SET O <FIND-OBJ "TORCH">> <AOBJS .WIN>>
+                          <1? <OLIGHT? .O>>>>
+                 <UNWIND
+                  <PROG ()
+                   <COND (.DUMMY?
+                          <TELL
+"I didn't realize that adventurers are stupid enough to light a 
+" 1 <ODESC2 .O> " in a room which reeks of coal gas.
+Fortunately, there is justice in the world.">)
+                         (<TELL
+"Oh dear.  It appears that the smell coming from this room was coal
+gas.  I would have thought twice about carrying a " 1 <ODESC2 .O> "in here.">)>
+                   <FWEEP 7>
+                   <JIGS-UP "   BOOOOOOOOOOOM      ">>
+                  <JIGS-UP "   BOOOOOOOOOOOM      ">>)>)>>    
+
+<DEFINE BATS-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (<AND <==? <VNAME .PRSACT> WALK-IN!-WORDS>
+               <NOT <MEMQ <FIND-OBJ "GARLI"> <AOBJS ,WINNER>>>>
+          <FLY-ME>)
+         (<==? .PRSACT ,LOOK!-WORDS>
+          <TELL 
+ "You are in a small room which has only one door, to the east.">
+          <AND <MEMQ <FIND-OBJ "GARLI"> <AOBJS ,WINNER>>
+               <TELL 
+"In the corner of the room on the ceiling is a large vampire bat who
+is obviously deranged and holding his nose.">>)>>
+
+<DEFINE FLY-ME ("AUX" (BAT-DROPS ,BAT-DROPS))
+      #DECL ((BAT-DROPS) <VECTOR [REST STRING]>)
+      <UNWIND
+        <PROG ()
+             <FWEEP 4 1>
+             <TELL
+  "A deranged giant vampire bat (a reject from WUMPUS) swoops down
+from his belfry and lifts you away....">
+             <GOTO <FIND-ROOM <PICK-ONE .BAT-DROPS>>>>
+       <GOTO <FIND-ROOM <PICK-ONE .BAT-DROPS>>>>
+      <PUT ,PRSVEC 2 <>>
+      <ROOM-DESC>
+      T>
+
+<DEFINE FWEEP (NUM "OPTIONAL" (SLP 0))
+    #DECL ((NUM SLP) FIX)
+    <REPEAT ((N .NUM))
+       <AND <0? <SET N <- .N 1>>> <RETURN>>
+       <IMAGE 7>
+       <OR <0? .SLP> <SLEEP .SLP>>>>
+
+<PSETG BAT-DROPS
+      '["MINE1"
+       "MINE2"
+       "MINE3"
+       "MINE4"
+       "MINE5"
+       "MINE6"
+       "MINE7"
+       "TLADD"
+       "BLADD"]>
+<GDECL (BAT-DROPS) <VECTOR [REST STRING]>>
+
+<SETG CAGE-TOP!-FLAG T>
+
+<DEFINE DUMBWAITER ("AUX" (PRSACT <1 ,PRSVEC>) (TB <FIND-OBJ "TBASK">)
+                         (TOP <FIND-ROOM "TSHAF">) (BOT <FIND-ROOM "BSHAF">)
+                         (FB <FIND-OBJ "FBASK">) (CT ,CAGE-TOP!-FLAG)
+                         (HERE ,HERE) (DUMMY ,DUMMY))
+    #DECL ((PRSACT) VERB (FB TB) OBJECT (TOP BOT) ROOM (CT) <OR ATOM FALSE>
+          (HERE) ROOM (DUMMY) <VECTOR [REST STRING]>)
+    <COND (<==? .PRSACT ,RAISE!-WORDS>
+          <COND (.CT
+                 <TELL <PICK-ONE ,DUMMY>>)
+                (<REMOVE-OBJECT .TB>
+                 <REMOVE-OBJECT .FB>
+                 <INSERT-OBJECT .TB .TOP>
+                 <INSERT-OBJECT .FB .BOT>
+                 <TELL "The basket is raised to the top of the shaft.">
+                 <SETG CAGE-TOP!-FLAG T>)>)
+         (<==? .PRSACT ,LOWER!-WORDS>
+          <COND (<NOT .CT>
+                 <TELL <PICK-ONE .DUMMY>>)
+                (<REMOVE-OBJECT .TB>
+                 <REMOVE-OBJECT .FB>
+                 <INSERT-OBJECT .TB .BOT>
+                 <INSERT-OBJECT .FB .TOP>
+                 <TELL "The basket is lowered to the bottom of the shaft.">
+                 <SETG CAGE-TOP!-FLAG <>>
+                 T)>)
+         (<==? .PRSACT ,TAKE!-WORDS>
+          <COND (<OR <AND .CT <==? .HERE .TOP>>
+                     <AND <NOT .CT> <==? .HERE .BOT>>>
+                 <TELL "The cage is securely fastened to the iron chain.">)
+                (<TELL "I can't see that here.">)>)>>
+
+<DEFINE MACHINE-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (<==? .PRSACT ,LOOK!-WORDS>
+          <TELL
+"You are in a large room which seems to be air-conditioned.  In one
+corner there is a machine (?) which is shaped somewhat like a clothes
+dryer.  On the 'panel' there is a switch which is labelled in a
+dialect of Swahili.  Fortunately, I know this dialect and the label
+translates to START.  The switch does not appear to be manipulable by
+any human hand (unless the fingers are about 1/16 by 1/4 inch).  On
+the front of the machine is a large lid.">
+          <COND (<OOPEN? <FIND-OBJ "MACHI">>
+                 <TELL "The lid on the machine is open.">)
+                (<TELL "The lid on the machine is closed.">)>)>>
+
+<DEFINE MACHINE-FUNCTION ("AUX" (DUMMY ,DUMMY)
+                         (PRSACT <1 ,PRSVEC>) (MACH <FIND-OBJ "MACHI">))
+   #DECL ((PRSACT) VERB (MACH) OBJECT (DUMMY) <VECTOR [REST STRING]>)
+   <COND
+    (<==? ,HERE <FIND-ROOM "MACHI">>
+     <COND
+      (<==? <VNAME .PRSACT> OPEN!-WORDS>
+       <COND (<OOPEN? .MACH>
+             <TELL <PICK-ONE .DUMMY>>)
+            (<TELL "The lid opens.">
+             <PUT .MACH ,OOPEN? T>)>)
+      (<==? <VNAME .PRSACT> CLOSE!-WORDS>
+       <COND (<OOPEN? .MACH>
+             <TELL "The lid closes.">
+             <PUT .MACH ,OOPEN? <>>
+             T)
+            (<TELL <PICK-ONE .DUMMY>>)>)
+      (<==? .PRSACT ,TAKE!-WORDS>)>)>>
+
+<DEFINE MSWITCH-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>) (C <FIND-OBJ "COAL">)
+                               (IMP <3 ,PRSVEC>) D (MACH <FIND-OBJ "MACHI">)
+                               (SCREW <FIND-OBJ "SCREW">))
+    #DECL ((PRSACT) VERB (IMP) OBJECT (MACH SCREW C D) OBJECT)
+    <COND (<==? .PRSACT ,TURN!-WORDS>
+          <COND (<==? .IMP .SCREW>
+                 <COND (<OOPEN? .MACH>
+                        <TELL
+                         "The machine doesn't seem to want to do anything.">)
+                       (<TELL 
+
+"The machine comes to life (figuratively) with a dazzling display of
+colored lights and bizarre noises.  After a few moments, the
+excitement abates.">
+                        <COND (<MEMQ .C <OCONTENTS .MACH>>
+                               <PUT .MACH
+                                    ,OCONTENTS
+                                    <SPLICE-OUT .C <OCONTENTS .MACH>>>
+                               <PUT .MACH
+                                    ,OCONTENTS
+                                    (<SET D <FIND-OBJ "DIAMO">>
+                                     !<OCONTENTS .MACH>)>
+                               <PUT .D ,OCAN .MACH>)
+                              (<NOT <EMPTY? <OCONTENTS .MACH>>>
+                               <PUT .MACH ,OCONTENTS (<SET D <FIND-OBJ "GUNK">>)>)
+                              (T)>)>)
+                (<TELL "It seems that a " 1 <ODESC2 .IMP> " won't do.">)>)>>
+
+<DEFINE GUNK-FUNCTION ("AUX" (G <FIND-OBJ "GUNK">) (M <OCAN .G>))
+  #DECL ((G) OBJECT (M) <OR OBJECT FALSE>)
+  <COND (.M
+        <PUT .M ,OCONTENTS <SPLICE-OUT .G <OCONTENTS .M>>>
+        <PUT .G ,OCAN <>>
+        <TELL
+"The slag turns out to be rather insubstantial, and crumbles into dust
+at your touch.  It must not have been very valuable.">)>>
+
+<SETG SCORE-MAX <+ ,SCORE-MAX <SETG LIGHT-SHAFT 10>>>
+
+<DEFINE NO-OBJS ()
+    <COND (<EMPTY? <AOBJS ,WINNER>>
+          <SETG EMPTY-HANDED!-FLAG T>)
+         (<SETG EMPTY-HANDED!-FLAG <>>)>
+    <COND (<AND <==? ,HERE <FIND-ROOM "BSHAF">>
+          <LIT? ,HERE>>
+          <SCORE-UPD ,LIGHT-SHAFT>
+          <SETG LIGHT-SHAFT 0>)>>
+<GDECL (LIGHT-SHAFT) FIX>
+
+<DEFINE CLIFF-FUNCTION ()
+    <COND (<MEMQ <FIND-OBJ "RBOAT"> <AOBJS ,WINNER>>
+          <SETG DEFLATE!-FLAG <>>)
+         (<SETG DEFLATE!-FLAG T>)>>
+
+<DEFINE STICK-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (<==? <VNAME .PRSACT> WAVE!-WORDS>
+          <COND (<OR <==? ,HERE <FIND-ROOM "FALLS">>
+                     <==? ,HERE <FIND-ROOM "POG">>>
+                 <COND (<NOT ,RAINBOW!-FLAG>
+                        <TRO <FIND-OBJ "POT"> ,OVISON>
+                        <TELL
+
+"Suddenly, the rainbow appears to become solid and, I venture,
+walkable (I think the giveaway was the stairs and bannister).">
+                        <SETG RAINBOW!-FLAG T>)
+                       (<TELL
+"The rainbow seems to have become somewhat run-of-the-mill.">
+                        <SETG RAINBOW!-FLAG <>>)>)
+                (<==? ,HERE <FIND-ROOM "RAINB">>
+                 <SETG RAINBOW!-FLAG <>>
+                 <JIGS-UP
+
+"The structural integrity of the rainbow seems to have left it,
+leaving you about 450 feet in the air, supported by water vapor.">)
+                (<TELL
+"Very good.">)>)>>
+
+<DEFINE FALLS-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (<==? .PRSACT ,LOOK!-WORDS>
+          <TELL
+"You are at the top of Aragain Falls, an enormous waterfall with a
+drop of about 450 feet.  The only path here is on the north end.
+There is a man-sized barrel here which you could fit into.">
+          <COND (,RAINBOW!-FLAG
+                 <TELL
+"A solid rainbow spans the falls.">)
+                (<TELL
+"A beautiful rainbow can be seen over the falls and to the east.">)>)>>
+
+<DEFINE DIGGER ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <COND (<==? .PRSO <FIND-OBJ "SHOVE">>)
+         (<TRNN .PRSO ,TOOLBIT>
+          <TELL
+"Digging with the " 1 <ODESC2 .PRSO> " is slow and tedious.">)
+         (<TELL
+"Digging with a " 1 <ODESC2 .PRSO> " is silly.">)>>
+
+<DEFINE DBOAT-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>) (HERE ,HERE) (PRSI <3 ,PRSVEC>)
+                       (DBOAT <FIND-OBJ "DBOAT">))
+    #DECL ((DBOAT) OBJECT (PRSACT) VERB (HERE) ROOM (PRSI) <OR FALSE OBJECT>)
+    <COND (<==? <VNAME .PRSACT> INFLA!-WORDS>
+          <TELL 
+"This boat will not inflate since some moron put a hole in it.">)
+         (<==? <VNAME .PRSACT> PLUG!-WORDS>
+          <COND (<==? .PRSI <FIND-OBJ "PUTTY">>
+                 <TELL
+"Well done.  The boat is repaired.">
+                 <COND (<NOT <OROOM .DBOAT>>
+                        <DROP-OBJECT .DBOAT>
+                        <TAKE-OBJECT <FIND-OBJ "IBOAT">>)
+                       (<REMOVE-OBJECT <FIND-OBJ "DBOAT">>
+                        <INSERT-OBJECT <FIND-OBJ "IBOAT"> .HERE>)>)
+                (<WITH-TELL .PRSI>)>)>>
+
+<DEFINE RBOAT-FUNCTION ("OPTIONAL" (ARG <>)
+                       "AUX" (PRSACT <1 ,PRSVEC>) (RBOAT <FIND-OBJ "RBOAT">)
+                             (IBOAT <FIND-OBJ "IBOAT">) (HERE ,HERE))
+    #DECL ((ARG) <OR FALSE ATOM> (PRSACT) VERB (IBOAT RBOAT) OBJECT (HERE) ROOM)
+    <COND (.ARG <>)
+         (<==? .PRSACT ,BOARD!-WORDS>
+          <COND (<MEMQ <FIND-OBJ "STICK"> <AOBJS ,WINNER>>
+                 <TELL
+"There is a hissing sound and the boat deflates.">
+                 <REMOVE-OBJECT .RBOAT>
+                 <INSERT-OBJECT <FIND-OBJ "DBOAT"> .HERE>
+                 T)>)
+         (<==? .PRSACT ,DISEM!-WORDS>
+          <AND <MEMBER "RIVR" <SPNAME <RID .HERE>>>
+               <JIGS-UP
+"Unfortunately, that leaves you in the water, where you drown.">>)
+         (<==? <VNAME .PRSACT> DEFLA!-WORDS>
+          <COND (<==? <AVEHICLE ,WINNER> .RBOAT>
+                 <TELL
+"You can't deflate the boat while you're in it.">)
+                (<NOT <MEMQ .RBOAT <ROBJS .HERE>>>
+                 <TELL
+"The boat must be on the ground to be deflated.">)
+                (<TELL
+"The boat deflates.">
+                 <SETG DEFLATE!-FLAG T>
+                 <REMOVE-OBJECT .RBOAT>
+                 <INSERT-OBJECT .IBOAT .HERE>)>)>>
+
+<DEFINE IBOAT-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>) (IBOAT <FIND-OBJ "IBOAT">)
+                             (RBOAT <FIND-OBJ "RBOAT">) (HERE ,HERE))
+    #DECL ((PRSACT) VERB (IBOAT RBOAT) OBJECT (HERE) ROOM)
+    <COND (<==? <VNAME .PRSACT> INFLA!-WORDS>
+          <COND (<NOT <MEMQ .IBOAT <ROBJS .HERE>>>
+                 <TELL
+"The boat must be on the ground to be inflated.">)
+                (<MEMQ <FIND-OBJ "PUMP"> <AOBJS ,WINNER>>
+                 <TELL
+"The boat inflates and appears seaworthy.">
+                 <SETG DEFLATE!-FLAG <>>
+                 <REMOVE-OBJECT .IBOAT>
+                 <INSERT-OBJECT .RBOAT .HERE>)
+                (<TELL
+"I don't think you have enough lung-power to inflate this boat.">)>)>>
+
+<DEFINE OVER-FALLS ()
+    <COND (<==? <1 ,PRSVEC> ,LOOK!-WORDS>)
+         (<JIGS-UP
+"Oh dear, you seem to have gone over Aragain Falls.  Not a very smart
+thing to do, apparently.">)>>
+
+<SETG BUOY-FLAG!-FLAG T>
+
+<DEFINE SHAKE ("AUX" (PRSOBJ <2 ,PRSVEC>) (HERE ,HERE))
+    #DECL ((PRSOBJ) OBJECT (HERE) ROOM)
+    <COND (<OBJECT-ACTION>)
+         (<AND <NOT <OOPEN? .PRSOBJ>>
+               <NOT <EMPTY? <OCONTENTS .PRSOBJ>>>
+               <TELL
+"It sounds like there is something inside the " 1 <ODESC2 .PRSOBJ> ".">>)
+         (<AND <OOPEN? .PRSOBJ>
+               <NOT <EMPTY? <OCONTENTS .PRSOBJ>>>>
+          <MAPF <>
+                <FUNCTION (X)
+                      #DECL ((X) OBJECT)
+                      <PUT .X ,OCAN <>>
+                      <INSERT-OBJECT .X .HERE>>
+                <OCONTENTS .PRSOBJ>>
+          <PUT .PRSOBJ ,OCONTENTS ()>
+          <TELL
+"All of the objects spill onto the floor.">)>>
+
+<DEFINE RIVR4-ROOM ()
+    <AND <MEMQ <FIND-OBJ "BUOY"> <AOBJS ,WINNER>>
+        ,BUOY-FLAG!-FLAG
+        <TELL
+         "Something seems funny about the feel of the buoy.">
+        <SETG BUOY-FLAG!-FLAG <>>>> 
+
+<DEFINE BEACH-ROOM ("AUX" (PRSACT <1 ,PRSVEC>) (SHOV <FIND-OBJ "SHOVE">)
+                             (HERE ,HERE) CNT)
+    #DECL ((PRSACT) VERB (SHOV) OBJECT (HERE) ROOM (CNT) FIX)
+    <COND (<AND <==? <VNAME .PRSACT> DIG!-WORDS>
+               <==? .SHOV <2 ,PRSVEC>>>
+          <PUT .HERE ,RVARS <SET CNT <+ 1 <RVARS .HERE>>>>
+          <COND (<G? .CNT 4>
+                 <PUT .HERE ,RVARS 0>
+                 <JIGS-UP "The hole collapses, smothering you.">)
+                (<==? .CNT 4>
+                 <TELL "You can see a small statue here in the sand.">
+                 <TRO <FIND-OBJ "STATU"> ,OVISON>
+                 <PUT .HERE ,RVARS .CNT>)
+                (<L? .CNT 0>)
+                (<TELL <NTH ,BDIGS .CNT>>)>)>>
+
+<DEFINE TCAVE-ROOM ("AUX" (PRSACT <1 ,PRSVEC>) (SHOV <FIND-OBJ "SHOVE">)
+                             (HERE ,HERE) CNT)
+    #DECL ((PRSACT) VERB (SHOV) OBJECT (HERE) ROOM (CNT) FIX)
+    <COND (<AND <==? <VNAME .PRSACT> DIG!-WORDS>
+               <==? <2 ,PRSVEC> .SHOV>>
+          <COND (<MEMQ <FIND-OBJ "GUANO"> <ROBJS .HERE>>
+                 <PUT .HERE ,RVARS <SET CNT <+ 1 <RVARS .HERE>>>>
+                 <COND (<G? .CNT 3>
+                        <TELL "This is getting you nowhere.">)
+                       (<TELL <NTH ,CDIGS .CNT>>)>)
+                (<TELL
+"There's nothing to dig into here.">)>)>>
+          
+<PSETG CDIGS
+   '["You are digging into a pile of bat guano."
+     "You seem to be getting knee deep in guano."
+     "You are covered with bat turds, cretin."]>
+
+<PSETG BDIGS
+   '["You seem to be digging a hole here."
+     "The hole is getting deeper, but that's about it."
+     "You are surrounded by a wall of sand on all sides."]>
+<GDECL (BDIGS CDIGS) <VECTOR [REST STRING]>>
+
+<DEFINE GERONIMO ()
+    <COND (<==? ,HERE <FIND-ROOM "BARRE">>
+          <JIGS-UP
+
+"I didn't think you would REALLY try to go over the falls in a
+barrel. It seems that some 450 feet below, you were met by a number
+of  unfriendly rocks and boulders, causing your immediate demise.  Is
+this what 'over a barrel' means?">)
+         (<TELL
+"Wasn't he an Indian?">)>>
+
+<PSETG SWIMYUKS
+   '["I don't really see how."
+     "I think that swimming is best performed in water."
+     "Perhaps it is your head that is swimming."]>
+<GDECL (SWIMYUKS) <VECTOR [REST STRING]>>
+
+<DEFINE SWIMMER ("AUX" (SWIMYUKS ,SWIMYUKS))
+    #DECL ((SWIMYUKS) <VECTOR [REST STRING]>)
+    <COND (<RTRNN ,HERE ,RFILLBIT>
+          <TELL 
+"Swimming is not allowed in this dungeon.">)
+         (<TELL <PICK-ONE .SWIMYUKS>>)>>
+
+
+<DEFINE GRUE-FUNCTION ("AUX" (PRSA <1 ,PRSVEC>))
+    #DECL ((PRSA) VERB)
+    <COND (<==? .PRSA ,EXAMI!-WORDS>
+          <TELL
+"The grue is a sinister, lurking presence in the dark places of the
+earth.  Its favorite diet is adventurers, 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 its fearsome jaws
+to tell the tale.">)
+         (<==? .PRSA ,FIND!-WORDS>
+          <TELL
+"There is no grue here, but I'm sure there is at least one lurking
+in the darkness nearby.  I wouldn't let my light go out if I were
+you!">)>>
+
+<SETG BTIE!-FLAG <>>
+
+<SETG BINF!-FLAG <>>
+
+<DEFINE BALLOON BALLACT ("OPTIONAL" (ARG <>)
+                        "AUX" (PRSVEC ,PRSVEC)
+                              (BALL <FIND-OBJ "BALLO">) (PRSA <1 .PRSVEC>)
+                              (PRSO <2 .PRSVEC>) (CONT <FIND-OBJ "RECEP">) M
+                              (BINF ,BINF!-FLAG) BLABE)
+       #DECL ((ARG) <OR ATOM FALSE> (BLABE BALL CONT RECEP) OBJECT (PRSA) VERB
+              (PRSO) <OR OBJECT DIRECTION> (M) <OR FALSE <PRIMTYPE VECTOR>>
+              (PRSVEC) <VECTOR [3 ANY]> (BINF) <OR FALSE ROOM>
+              (M) <OR FALSE <<PRIMTYPE VECTOR> ANY ROOM>>)
+       <COND (<==? .ARG READ-OUT>
+              <COND (<==? .PRSA ,LOOK!-WORDS>
+                     <COND (.BINF
+                            <TELL 
+                                 "The cloth bag is inflated and there is a "
+                                  1
+                                  <ODESC2 .BINF>
+                                  " burning in the receptacle.">)
+                           (<TELL "The cloth bag is draped over the the basket.">)>
+                     <COND (,BTIE!-FLAG
+                            <TELL "The balloon is tied to the hook.">)>)>    
+              <RETURN <> .BALLACT>)>
+       <COND (<==? .ARG READ-IN>
+              <COND (<==? .PRSA ,WALK!-WORDS>
+                     <COND (<SET M
+                                 <MEMQ <CHTYPE <2 .PRSVEC> ATOM>
+                                       <REXITS ,HERE>>>
+                            <COND (,BTIE!-FLAG
+                                   <TELL "You are tied to the ledge.">
+                                   <RETURN T .BALLACT>)
+                                  (ELSE
+                                   <AND <NOT <RTRNN <2 .M> ,RMUNGBIT>>
+                                        <SETG BLOC <2 .M>>>
+                                   <RETURN <> .BALLACT>)>)
+                           (<TELL 
+"I'm afraid you can't control the balloon in this way.">
+                            <RETURN T .BALLACT>)>)
+                    (<AND <==? .PRSA ,TAKE!-WORDS>
+                          <==? ,BINF!-FLAG .PRSO>>
+                     <TELL "You don't really want to hold a burning "
+                           1
+                           <ODESC2 .PRSO>
+                           ".">
+                     <RETURN T .BALLACT>)
+                    (<AND <==? .PRSA ,PUT!-WORDS>
+                          <==? <3 .PRSVEC> .CONT>
+                          <NOT <EMPTY? <OCONTENTS .CONT>>>>
+                     <TELL "The receptacle is already occupied.">
+                     <RETURN T .BALLACT>)
+                    (<RETURN <> .BALLACT>)>)>
+       <COND (<==? .PRSA ,BURN!-WORDS>
+              <COND (<MEMQ .PRSO <OCONTENTS .CONT>>
+                     <TELL "The "
+                           1
+                           <ODESC2 .PRSO>
+                           " burns inside the receptacle.">
+                     <SETG BURNUP-INT <CLOCK-INT ,BRNIN <* <OSIZE .PRSO> 20>>>
+                     <TRO .PRSO ,FLAMEBIT>
+                     <TRZ .PRSO <+ ,TAKEBIT ,READBIT>>
+                     <PUT .PRSO ,OLIGHT? 1>
+                     <COND (,BINF!-FLAG)
+                           (<TELL 
+"The cloth bag inflates as it fills with hot air.">
+                            <COND (<NOT ,BLAB!-FLAG>
+                                   <PUT .BALL
+                                        ,OCONTENTS
+                                        (<SET BLABE <FIND-OBJ "BLABE">>
+                                         !<OCONTENTS .BALL>)>
+                                   <PUT .BLABE ,OCAN .BALL>)>
+                            <SETG BLAB!-FLAG T>
+                            <SETG BINF!-FLAG .PRSO>
+                            <CLOCK-INT ,BINT 3>)>)>)
+             (<AND <==? .PRSA ,DISEM!-WORDS>
+                   <RTRNN ,HERE ,RLANDBIT>>
+              <COND (,BINF!-FLAG
+                     <CLOCK-INT ,BINT 3>)>
+              <>)
+             (<==? .PRSA ,C-INT!-WORDS>
+              <COND (<OR <AND <OOPEN? .CONT> ,BINF!-FLAG>
+                         <MEMBER "LEDG" <SPNAME <RID ,HERE>>>>
+                     <RISE-AND-SHINE .BALL ,HERE>)
+                    (<DECLINE-AND-FALL .BALL ,HERE>)>)>>
+
+<SETG BLAB!-FLAG <>>
+
+<GDECL (BURNUP-INT BINT) CEVENT>
+<DEFINE RISE-AND-SHINE (BALL HERE
+                       "AUX" (S <TOP ,SCRSTR>) M
+                             (IN? <==? <AVEHICLE ,WINNER> .BALL>) (BL ,BLOC)
+                             FOO)
+       #DECL ((BALL) OBJECT (HERE BL) ROOM (M) <OR FALSE STRING> (S) STRING
+              (IN?) <OR ATOM FALSE> (FOO) CEVENT)
+       <CLOCK-INT ,BINT 3>
+       <COND (<SET M <MEMBER "VAIR" <SPNAME <RID .BL>>>>
+              <COND (<=? <REST .M 4> "4">
+                     <CLOCK-DISABLE ,BURNUP-INT>
+                     <CLOCK-DISABLE ,BINT>
+                     <REMOVE-OBJECT .BALL>
+                     <INSERT-OBJECT <FIND-OBJ "DBALL"> <FIND-ROOM "VLBOT">>
+                     <COND (.IN?
+                            <JIGS-UP 
+
+"Your balloon has hit the rim of the volcano, ripping the cloth and
+causing you a 500 foot drop.  Did you get your flight insurance?">)
+                           (<TELL 
+"You hear a boom and notice that the balloon is falling to the ground.">)>
+                     <SETG BLOC <FIND-ROOM "VLBOT">>)
+                    (<SUBSTRUC <SPNAME <RID .BL>> 0 4 .S>
+                     <PUT .S 5 <CHTYPE <+ <CHTYPE <5 .M> FIX> 1> CHARACTER>>
+                     <COND (.IN?
+                            <GOTO <SETG BLOC <FIND-ROOM .S>>>
+                            <TELL "The balloon ascends.">
+                            <ROOM-INFO T>)
+                           (<PUT-BALLOON .BALL .BL .S "ascends.">)>)>)
+             (<SET M <MEMBER "LEDG" <SPNAME <RID .BL>>>>
+              <SUBSTRUC "VAIR" 0 4 .S>
+              <PUT .S 5 <5 .M>>
+              <COND (.IN?
+                     <GOTO <SETG BLOC <FIND-ROOM .S>>>
+                     <TELL "The balloon leaves the ledge.">
+                     <ROOM-INFO T>)
+                    (<CLOCK-INT ,VLGIN 10>
+                     <PUT-BALLOON .BALL .BL .S "floats away.  It seems to be ascending,
+due to its light load.">)>)
+             (.IN?
+              <GOTO <SETG BLOC <FIND-ROOM "VAIR1">>>
+              <TELL "The balloon rises slowly from the ground.">
+              <ROOM-INFO T>)
+             (<PUT-BALLOON .BALL .BL "VAIR1" "lifts off.">)>>
+
+<DEFINE PUT-BALLOON (BALL HERE THERE STR) 
+       #DECL ((BALL) OBJECT (HERE) ROOM (THERE STR) STRING)
+       <AND <MEMBER "LEDG" <SPNAME <RID ,HERE>>>
+            <TELL "You watch as the balloon slowly " 1 .STR>>
+       <REMOVE-OBJECT .BALL>
+       <INSERT-OBJECT .BALL <SETG BLOC <FIND-ROOM .THERE>>>>
+
+<GDECL (BLOC) ROOM>
+
+<DEFINE DECLINE-AND-FALL (BALL HERE "AUX" (S <TOP ,SCRSTR>) M (BL ,BLOC)
+                           (IN? <==? <AVEHICLE ,WINNER> .BALL>) FOO)
+    #DECL ((BALL) OBJECT (HERE BL) ROOM (M) <OR FALSE STRING> (S) STRING
+          (IN?) <OR ATOM FALSE> (FOO) CEVENT)
+    <CLOCK-INT ,BINT 3>
+    <COND (<SET M <MEMBER "VAIR" <SPNAME <RID .BL>>>>
+          <COND (<=? <REST .M 4> "1">
+                 <COND (.IN?
+                        <GOTO <SETG BLOC <FIND-ROOM "VLBOT">>>
+                        <COND (,BINF!-FLAG
+                               <TELL "The balloon has landed.">
+                               <ROOM-INFO T>)
+                              (T
+                               <REMOVE-OBJECT .BALL>
+                               <INSERT-OBJECT <FIND-OBJ "DBALL"> ,BLOC>
+                               <PUT ,WINNER ,AVEHICLE <>>
+                               <CLOCK-DISABLE <SET FOO <CLOCK-INT ,BINT 0>>>
+                               <TELL 
+"You have landed, but the balloon did not survive.">)>)
+                       (<PUT-BALLOON .BALL .BL "VLBOT" "lands.">)>)
+                (<SUBSTRUC <SPNAME <RID .BL>> 0 4 .S>
+                 <PUT .S 5 <CHTYPE <- <CHTYPE <5 .M> FIX> 1> CHARACTER>>
+                 <COND (.IN?
+                        <GOTO <SETG BLOC <FIND-ROOM .S>>>
+                        <TELL "The balloon descends.">
+                        <ROOM-INFO T>)
+                       (<PUT-BALLOON .BALL .BL .S "descends.">)>)>)>>
+
+<DEFINE WIRE-FUNCTION ("AUX" (PV ,PRSVEC) (PRSA <1 .PV>) (PRSO <2 .PV>)
+                            (PRSI <3 .PV>) (BINT ,BINT))
+        #DECL ((BINT) CEVENT (PV) VECTOR (PRSA) VERB (PRSO PRSI) PRSOBJ)
+        <COND (<==? .PRSA ,TIE!-WORDS>
+              <COND (<AND <==? .PRSO <FIND-OBJ "BROPE">>
+                          <OR <==? .PRSI <FIND-OBJ "HOOK1">>
+                              <==? .PRSI <FIND-OBJ "HOOK2">>>>
+                     <SETG BTIE!-FLAG T>
+                     <CLOCK-DISABLE .BINT>
+                     <TELL "The balloon is fastened to the hook.">)>)
+             (<AND <==? .PRSA ,UNTIE!-WORDS>
+                   <==? .PRSO <FIND-OBJ "BROPE">>>
+              <COND (,BTIE!-FLAG
+                     <CLOCK-ENABLE <SET BINT <CLOCK-INT ,BINT 3>>>
+                     <SETG BTIE!-FLAG <>>
+                     <TELL "The wire falls off of the hook.">)
+                    (<TELL "The wire is not tied to anything.">)>)>>
+
+<DEFINE BURNUP ("AUX" (R <FIND-OBJ "RECEP">) (OBJ <1 <OCONTENTS .R>>))
+    #DECL ((R OBJ) OBJECT)
+    <PUT .R ,OCONTENTS <SPLICE-OUT .OBJ <OCONTENTS .R>>>
+    <TELL 
+"It seems that the " 1 <ODESC2 .OBJ> " has burned out, and the cloth
+bag starts to collapse.">
+    <SETG BINF!-FLAG <>>
+    T>
+
+<SETG SAFE-FLAG!-FLAG <>>
+
+<DEFINE SAFE-ROOM ("AUX" (PRSA <1 ,PRSVEC>))
+    #DECL ((PRSA) VERB)
+    <COND (<==? .PRSA ,LOOK!-WORDS>
+          <TELL 
+"You are in a dusty old room which is virtually featureless, except
+for an exit on the north side."
+                1
+                <COND (<NOT ,SAFE-FLAG!-FLAG>
+                       "
+Imbedded in the far wall, there is a rusty old box.  It appears that
+the box is somewhat damaged, since an oblong hole has been chipped
+out of the front of it.")
+                      ("
+On the far wall is a rusty box, whose door has been blown off.")>>)>>
+
+<DEFINE SAFE-FUNCTION ("AUX" (PRSA <1 ,PRSVEC>)) 
+       #DECL ((PRSA) VERB)
+       <COND (<==? .PRSA ,TAKE!-WORDS>
+              <TELL "The box is imbedded in the wall.">)
+             (<==? .PRSA ,OPEN!-WORDS>
+              <COND (,SAFE-FLAG!-FLAG <TELL "The box has no door!">)
+                    (<TELL "The box is rusted and will not open.">)>)
+             (<==? .PRSA ,CLOSE!-WORDS>
+              <COND (,SAFE-FLAG!-FLAG <TELL "The box has no door!">)
+                    (<TELL "The box is not open, chomper!">)>)
+             (<==? .PRSA ,BLAST!-WORDS> <TELL "What do you expect, BOOM?">)>>
+
+<PSETG BRICK-BOOM 
+"Now you've done it.  It seems that the brick has other properties
+than weight, namely the ability to blow you to smithereens.">
+
+<DEFINE BRICK-FUNCTION ("AUX" (PRSA <1 ,PRSVEC>))
+    #DECL ((PRSA) VERB)
+    <COND (<==? .PRSA ,BURN!-WORDS> <JIGS-UP ,BRICK-BOOM>)>>
+
+<DEFINE FUSE-FUNCTION ("AUX" (PRSA <1 ,PRSVEC>) (FUSE <FIND-OBJ "FUSE">)
+                            (BRICK <FIND-OBJ "BRICK">) BRICK-ROOM OC)
+       #DECL ((PRSA) VERB (FUSE BRICK) OBJECT (BRICK-ROOM) <OR ROOM FALSE>
+              (OC) <OR OBJECT FALSE>)
+       <COND (<==? .PRSA ,BURN!-WORDS>
+              <TELL "The wire starts to burn.">
+              <PUT .FUSE ,ORAND [0 <CLOCK-INT ,FUSIN 2>]>)
+             (<==? .PRSA ,C-INT!-WORDS>
+              <TRZ .FUSE ,OVISON>
+              <COND (<==? <OCAN .FUSE> .BRICK>
+                     <TRZ .BRICK ,OVISON>
+                     <COND (<SET OC <OCAN .BRICK>>
+                            <SET BRICK-ROOM <OROOM .OC>>)
+                           (<SET BRICK-ROOM <OROOM .BRICK>>)>
+                     <OR .BRICK-ROOM <SET BRICK-ROOM ,HERE>>
+                     <COND (<==? .BRICK-ROOM ,HERE>
+                            <MUNG-ROOM .BRICK-ROOM
+                               "The way is blocked by debris from an explosion.">
+                            <JIGS-UP ,BRICK-BOOM>)
+                           (<==? .BRICK-ROOM <FIND-ROOM "SAFE">>
+                            <CLOCK-INT ,SAFIN 5>
+                            <SETG MUNGED-ROOM <OROOM .BRICK>>
+                            <TELL "There is an explosion nearby.">
+                            <COND (<MEMQ .BRICK <OCONTENTS <FIND-OBJ "SSLOT">>>
+                                   <TRZ <FIND-OBJ "SSLOT"> ,OVISON>
+                                   <PUT <FIND-OBJ "SAFE"> ,OOPEN? T>
+                                   <SETG SAFE-FLAG!-FLAG T>)>)
+                           (<TELL "There is an explosion nearby.">
+                            <CLOCK-INT ,SAFIN 5>
+                            <SETG MUNGED-ROOM .BRICK-ROOM>
+                            <MAPF <>
+                                  <FUNCTION (X)
+                                    <COND (<CAN-TAKE? .X>
+                                           <TRZ .X ,OVISON>)>>
+                                  <ROBJS .BRICK-ROOM>>
+                            <COND (<==? .BRICK-ROOM <FIND-ROOM "LROOM">>
+                                   <MAPF <>
+                                         <FUNCTION (X) #DECL ((X) OBJECT)
+                                           <PUT .X ,OCAN <>>>
+                                         <OCONTENTS <FIND-OBJ "TCASE">>>
+                                   <PUT <FIND-OBJ "TCASE"> ,OCONTENTS ()>)>)>)
+                    (<OR <NOT <OROOM .FUSE>> <==? ,HERE <OROOM .FUSE>>>
+                     <TELL "The wire rapidly burns into nothingness.">)>)>>
+
+<DEFINE SAFE-MUNG ("AUX" (RM ,MUNGED-ROOM)) 
+       #DECL ((RM) ROOM)
+       <COND (<==? ,HERE .RM>
+              <JIGS-UP
+               <COND (<RTRNN .RM ,RHOUSEBIT>
+"The house shakes, and the ceiling of the room you're in collapses,
+turning you into a pancake.") 
+("The room trembles and 50,000 pounds of rock fall on you, turning you
+into a pancake.")>>)
+             (<TELL
+"You may recall your recent explosion.  Well, probably as a result of
+that, you hear an ominous rumbling, as if one of the rooms in the
+dungeon had collapsed.">
+              <AND <==? .RM <FIND-ROOM "SAFE">>
+                   <CLOCK-INT ,LEDIN 8>>)>
+       <MUNG-ROOM <OR <OROOM <FIND-OBJ "BRICK">> ,HERE>
+                  "The way is blocked by debris from an explosion.">>
+
+<DEFINE LEDGE-MUNG ("AUX" (RM <FIND-ROOM "LEDG4">))
+    #DECL ((RM) ROOM)
+    <COND (<==? ,HERE .RM>
+          <COND (<AVEHICLE ,WINNER>
+                 <COND (,BTIE!-FLAG
+                        <SET RM <FIND-ROOM "VLBOT">>
+                        <SETG BLOC .RM>
+                        <REMOVE-OBJECT <FIND-OBJ "BALLO">>
+                        <INSERT-OBJECT <FIND-OBJ "DBALL"> .RM>
+                        <SETG BTIE!-FLAG <>>
+                        <SETG BINF!-FLAG <>>
+                        <CLOCK-DISABLE ,BINT>
+                        <CLOCK-DISABLE ,BRNIN>
+                        <JIGS-UP
+"The ledge collapses, probably as a result of the explosion.  A large
+chunk of it, which is attached to the hook, drags you down to the
+ground.  Fatally.">)
+                       (<TELL "The ledge collapses, leaving you with no place to land.">)>)
+                (T
+                 <JIGS-UP
+"The force of the explosion has caused the ledge to collapse
+belatedly.">)>)
+         (<TELL "The ledge collapses, giving you a narrow escape.">)>
+    <MUNG-ROOM .RM "The ledge has collapsed and cannot be landed on.">>
+
+<DEFINE LEDGE-FUNCTION ("AUX" (PRSA <1 ,PRSVEC>))
+    #DECL ((PRSA) VERB)
+    <COND (<==? .PRSA ,WALK-IN!-WORDS>
+          <AND ,SAFE-FLAG!-FLAG
+               <TELL
+"Behind you, the walls of the safe room collapse into rubble.">
+               <SETG SAFE-FLAG!-FLAG <>>>)
+         (<==? .PRSA ,LOOK!-WORDS>
+          <TELL 
+"You are on a wide ledge high into the volcano.  The rim of the
+volcano is about 200 feet above and there is a precipitous drop below
+to the bottom." 1
+               <COND (<RTRNN <FIND-ROOM "SAFE"> ,RMUNGBIT>
+                      " The way to the south is blocked by rubble.")
+                     (" There is a small door to the south.")>>)>>
+
+<DEFINE BLAST ()
+    <COND (<==? ,HERE <FIND-ROOM "SAFE">>)
+         (<TELL "I don't really know how to do that.">)>>
+
+<DEFINE VOLGNOME ()
+    <COND (<MEMBER "LEDG" <SPNAME <RID ,HERE>>>
+          <TELL 
+"A volcano gnome seems to walk straight out of the wall and says
+'I have a very busy appointment schedule and little time to waste on
+tresspassers, but for a small fee, I'll show you the way out.'  You
+notice the gnome nervously glancing at his watch.">
+          <INSERT-OBJECT <FIND-OBJ "GNOME"> ,HERE>)
+         (<CLOCK-INT ,VLGIN 1>)>>
+
+<SETG GNOME-DOOR!-FLAG <SETG GNOME-FLAG!-FLAG <>>>
+
+<DEFINE GNOME-FUNCTION ("AUX" (PV ,PRSVEC) (PRSA <1 .PV>) (PRSO <2 .PV>))
+    #DECL ((PV) VECTOR (PRSA) VERB (PRSO) PRSOBJ)
+    <COND (<AND <OR <==? .PRSA ,GIVE!-WORDS>
+                   <==? .PRSA ,THROW!-WORDS>>
+               <TYPE? .PRSO OBJECT>
+               <COND (<N==? <OTVAL .PRSO> 0>
+                      <TELL 
+"Thank you very much for the " 1 <ODESC2 .PRSO> ".  I don't believe 
+I've ever seen one as beautiful. 'Follow me', he says, and a door 
+appears on the west end of the ledge.  Through the door, you can see
+a narrow chimney sloping steeply downward.">
+                      <SETG GNOME-DOOR!-FLAG T>)
+                     (<TELL
+"'That wasn't quite what I had in mind', he says, crunching the
+" 1 <ODESC2 .PRSO> " in his rock-hard hands.">
+                      <REMOVE-OBJECT .PRSO>)>>)
+         (<==? .PRSA ,C-INT!-WORDS>
+          <TELL
+"The gnome glances at his watch.  'Oops.  I'm late for an
+appointment!' He disappears, leaving you alone on the ledge.">
+          <REMOVE-OBJECT <FIND-OBJ "GNOME">>)
+         (<TELL 
+"The gnome appears increasingly nervous.">
+          <OR ,GNOME-FLAG!-FLAG <CLOCK-INT ,GNOIN 5>>
+          <SETG GNOME-FLAG!-FLAG T>)>>
+
+\f
\ No newline at end of file
diff --git a/zork/dung.56 b/zork/dung.56
new file mode 100644 (file)
index 0000000..cd7a563
--- /dev/null
@@ -0,0 +1,3125 @@
+"VOCABULARY"
+
+;"GLOBAL VARIABLES WHICH ARE ROOMS MUST BE HERE!"
+
+<PSETG RMGVALS '![BLOC HERE!]>
+
+;"GLOBAL VARIABLES WHICH ARE OBJECTS MUST BE HERE!"
+
+<PSETG OBJGVALS '![!]>
+
+;"GLOBAL VARIABLES WHICH ARE MONADS MUST BE HERE!"
+
+<PSETG MGVALS
+      '![KITCHEN-WINDOW!-FLAG
+        TROLL-FLAG!-FLAG
+        CAGE-SOLVE!-FLAG
+        KEY-FLAG!-FLAG
+        BUCKET-TOP!-FLAG
+        CAROUSEL-FLIP!-FLAG
+        CAROUSEL-ZOOM!-FLAG
+        LOW-TIDE!-FLAG
+        DOME-FLAG!-FLAG
+        GLACIER-FLAG!-FLAG
+        ECHO-FLAG!-FLAG
+        RIDDLE-FLAG!-FLAG
+        LLD-FLAG!-FLAG
+        CYCLOPS-FLAG!-FLAG
+        MAGIC-FLAG!-FLAG
+        TRAP-DOOR!-FLAG
+        LIGHT-LOAD!-FLAG
+        SAFE-FLAG!-FLAG
+        GNOME-FLAG!-FLAG
+        GNOME-DOOR!-FLAG
+        MIRROR-MUNG!-FLAG
+        EGYPT-FLAG!-FLAG
+        ON-POLE!-FLAG
+        BLAB!-FLAG
+        BINF!-FLAG
+        BTIE!-FLAG
+        BUOY-FLAG!-FLAG
+        GRUNLOCK!-FLAG
+        GATE-FLAG!-FLAG
+        RAINBOW!-FLAG
+        CAGE-TOP!-FLAG
+        EMPTY-HANDED!-FLAG
+        DEFLATE!-FLAG
+        LIGHT-SHAFT
+        PLAYED-TIME
+        MOVES
+        BRIEF!-FLAG
+        THEN
+        SUPER-BRIEF!-FLAG
+        RAW-SCORE!]>
+
+<PSETG CNTUSE "You can't use that!">
+
+<SETG BIGFIX </ <CHTYPE <MIN> FIX> 2>>
+
+<SETG WORDS <OR <GET WORDS OBLIST> <MOBLIST WORDS 23>>>
+
+<SETG OBJECT-OBL <OR <GET OBJECTS OBLIST> <MOBLIST OBJECTS>>>
+
+<SETG ROOM-OBL <OR <GET ROOMS OBLIST> <MOBLIST ROOMS>>>
+
+<SETG ACTORS ()>
+
+<SETG STARS ()>
+
+<ADD-BUZZ "BY" "IS" "ONE" "IT" "A" "THE" "AN" "THIS" "OVER">
+
+<ADD-DIRECTIONS "#!#!#" "NORTH" "SOUTH" "EAST" "WEST" "LAUNC" "LAND"
+       "SE" "SW" "NE" "NW" "UP" "DOWN" "ENTER" "EXIT" "CROSS" "CLIMB">
+
+<DSYNONYM "NORTH" "N">
+<DSYNONYM "SOUTH" "S">
+<DSYNONYM "EAST" "E">
+<DSYNONYM "WEST" "W">
+<DSYNONYM "UP" "U">
+<DSYNONYM "DOWN" "D">
+<DSYNONYM "ENTER" "IN">
+<DSYNONYM "EXIT" "OUT" "LEAVE">
+<DSYNONYM "CROSS" "TRAVE">
+
+<ADD-ZORK PREP "WITH" "AT" "TO" "IN" "DOWN" "UP" "UNDER">
+
+<SYNONYM "WITH" "USING" "THROU">
+
+<SYNONYM "IN" "INSID" "INTO">
+
+<SETG ROOMS ()>
+
+<SETG OBJECTS ()>
+
+\f
+"CEVENT DEFINITIONS"
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,CURE-CLOCK <> "CURIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,MAINT-ROOM T "MNTIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,LANTERN T "LNTIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,MATCH-FUNCTION T MATIN>>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,CANDLES T "CNDIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,BALLOON T "BINT">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,BURNUP T "BRNIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,FUSE-FUNCTION T "FUSIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,LEDGE-MUNG T "LEDIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,SAFE-MUNG T "SAFIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,VOLGNOME T "VLGIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,GNOME-FUNCTION T "GNOIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,BUCKET T "BCKIN">>
+
+<OR <LOOKUP "COMPILE" <ROOT>>
+    <CEVENT 0 ,SPHERE-FUNCTION T "SPHIN">>
+
+\f
+; "KLUDGE"
+
+#OBJECT {"#####"
+        "You are here" "cretin" %<> %<> () %<> %,OVISON} 
+
+"MAZE"
+
+<PSETG FOREST "Forest">
+
+<PSETG CURRENT #NEXIT "You cannot go upstream due to strong currents.">
+
+#ROOM {"PASS1"
+"You are in a narrow east-west passageway.  There is a narrow stairway
+leading down at the north end of the room."
+       "East-West Passage"
+       %<>
+       #EXIT {"EAST" "CAROU" "WEST" "MTROL" "DOWN" "RAVI1" "NORTH" "RAVI1"} 
+       () %<> 5}
+
+#ROOM {"WHOUS"
+"You are in an open field west of a big white house, with a boarded
+front door."
+       "West of House"
+       T
+       #EXIT {"NORTH" "NHOUS" "SOUTH" "SHOUS" "WEST" "FORE1"
+             "EAST" #NEXIT "The door is locked, and there is evidently no key."}
+       (#FIND-OBJ {"FDOOR"} #FIND-OBJ {"MAILB"})}
+
+#ROOM {"NHOUS"
+       "You are facing the north side of a white house.  There is no door here,
+and all the windows are barred."
+       "North of House"
+       T
+       #EXIT {"WEST" "WHOUS" "EAST" "EHOUS" "NORTH" "FORE3"
+             "SOUTH" #NEXIT "The windows are all barred."}}
+
+#ROOM {"SHOUS"
+"You are facing the south side of a white house. There is no door here,
+and all the windows are barred."
+       "South of House"
+       T
+       #EXIT {"WEST" "WHOUS" "EAST" "EHOUS" "SOUTH" "FORE2"
+             "NORTH" #NEXIT "The windows are all barred."}
+       ()}
+
+#ROOM {"EHOUS"
+       ""
+       "Behind House"
+       T
+       #EXIT {"NORTH" "NHOUS" "SOUTH" "SHOUS" "EAST" "CLEAR"
+             "WEST" #CEXIT {"KITCHEN-WINDOW" "KITCH"}
+             "ENTER" #CEXIT {"KITCHEN-WINDOW" "KITCH"}}
+       (#FIND-OBJ {"WIND1"})
+       EAST-HOUSE}
+
+#ROOM {"KITCH"
+       ""
+       "Kitchen"
+       T
+       #EXIT {"EAST" #CEXIT {"KITCHEN-WINDOW" "EHOUS"} "WEST" "LROOM"
+             "EXIT" #CEXIT {"KITCHEN-WINDOW" "EHOUS"} "UP" "ATTIC"
+             "DOWN" #NEXIT "Only Santa Claus climbs down chimneys."}
+       (#FIND-OBJ {"WIND2"} #FIND-OBJ {"SBAG"} #FIND-OBJ {"BOTTL"})
+       KITCHEN 10}
+
+<ADD-OBJECT
+ #OBJECT {"SBAG"
+         "A sandwich bag is here."
+         "sandwich bag"
+         "On the table is an elongated brown sack, smelling of hot peppers."
+         %<> (#FIND-OBJ {"GARLI"} #FIND-OBJ {"FOOD"})
+         %<> %<+ ,CONTBIT ,FLAMEBIT ,OVISON ,TAKEBIT> 0 0 0 3 15}
+["BAG" "SACK" "BAGGI"] ["BROWN"]>
+
+<ADD-OBJECT
+ #OBJECT {"GARLI"
+         "There is a clove of garlic here."
+         "clove of garlic"
+         %<> %<> () #FIND-OBJ {"SBAG"} %<+ ,TAKEBIT ,FOODBIT ,OVISON> 0 0 0 5 0}
+["CLOVE"]>
+
+
+<ADD-OBJECT
+ #OBJECT {"FOOD"
+         "A hot pepper sandwich is here."
+         "\.lunch"
+         %<>
+         %<> () #FIND-OBJ {"SBAG"} %<+ ,FOODBIT ,TAKEBIT ,OVISON> 0 0 0 5 0}
+["SANDW" "LUNCH" "PEPPE" "DINNE" "SNACK"]>
+
+<ADD-OBJECT
+ #OBJECT {"GUNK"
+         "There is a small piece of vitreous slag here."
+         "piece of vitreous slag"
+         %<> GUNK-FUNCTION () %<> %<+ ,TRYTAKEBIT ,TAKEBIT ,OVISON> 0 0 0 10 0}
+["MESS" "SLAG"] ["VITRE"]>
+
+<ADD-OBJECT
+ #OBJECT {"COAL"
+         "There is a small heap of coal here."
+         "small pile of coal"
+         %<> %<> () %<> %<+ ,BURNBIT ,TAKEBIT ,OVISON> 0 0 0 20 0}
+["HEAP" "CHARC"]>
+
+<ADD-OBJECT
+ #OBJECT {"JADE"
+         "There is an exquisite jade figurine here."
+         "jade figurine"
+         %<> %<> () %<> %<+ ,TAKEBIT ,OVISON> 0 5 5 10 0}
+["FIGUR"]>
+
+<ADD-OBJECT
+ #OBJECT {"MACHI"
+         ""
+         "machine"
+         %<> MACHINE-FUNCTION () %<> %<+ ,CONTBIT ,OVISON> 0 0 0 %,BIGFIX 50}
+["PDP10" "DRYER" "LID"]>
+
+<ADD-OBJECT 
+ #OBJECT {"DIAMO"
+         "There is an enormous diamond (perfectly cut) here."
+         "huge diamond"
+         %<>
+         %<> () %<> %<+ ,TAKEBIT ,OVISON> 0 10 6 5 0}
+ ["PERFE"]>
+
+<ADD-OBJECT
+ #OBJECT {"TCASE"
+         "There is a trophy case here."
+         "trophy case"
+         %<> TROPHY-CASE () %<> %<+ ,CONTBIT ,TRANSBIT ,OVISON>
+         0 0 0 %,BIGFIX %,BIGFIX}
+ ["CASE"] ["TROPH"]>
+
+<ADD-OBJECT 
+ #OBJECT {"BOTTL"
+        "A clear glass bottle is here."
+        "glass bottle"
+        "A bottle is sitting on the table."
+        BOTTLE-FUNCTION
+        (#FIND-OBJ {"WATER"})
+        %<>
+        %<+ ,CONTBIT ,TRANSBIT ,TAKEBIT ,OVISON> 0 0 0 5 4}
+["CONTA" "PITCH"] ["GLASS"]>
+
+<ADD-OBJECT
+ #OBJECT {"WATER"
+        "Water"
+        "quantity of water"
+        "There is some water here"
+        WATER-FUNCTION
+        ()
+        #FIND-OBJ {"BOTTL"}
+        %<+ ,DRINKBIT ,TAKEBIT ,OVISON> 0 0 0 4 0}[ "LIQUI" "H2O"]>
+
+#ROOM {"ATTIC"
+"You are in the attic.  The only exit is stairs that lead down."
+       "Attic"
+       %<>
+       #EXIT {"DOWN" "KITCH"}
+       (#FIND-OBJ {"BRICK"} #FIND-OBJ {"ROPE"} #FIND-OBJ {"KNIFE"})}
+
+<ADD-OBJECT
+ #OBJECT {"ROPE"
+         "There is a large coil of rope here."
+         "rope"
+         "A large coil of rope is lying in the corner."
+         ROPE-FUNCTION () %<> %<+ ,TIEBIT ,TAKEBIT ,OVISON> 0 0 0 10 0}
+["HEMP" "COIL"]>
+
+
+<ADD-OBJECT
+ #OBJECT {"KNIFE"
+         "There is a nasty-looking knife lying here."
+         "knife"
+         "On a table is a nasty-looking knife."
+         %<> () %<> %<+ ,TAKEBIT ,OVISON ,WEAPONBIT> 0 0 0 5 0}
+["BLADE"] ["NASTY"]>
+
+<ADD-MELEE <FIND-OBJ "KNIFE"> ,KNIFE-MELEE>
+
+#ROOM {"LROOM"
+       ""
+       "Living Room"
+       T
+       #EXIT {"EAST" "KITCH"
+             "WEST" #CEXIT {"MAGIC-FLAG" "BLROO" "The door is nailed shut."}
+             "DOWN" #CEXIT {"TRAP-DOOR" "CELLA"}}
+       (#FIND-OBJ {"WDOOR"} #FIND-OBJ {"DOOR"} #FIND-OBJ {"TCASE"} 
+       #FIND-OBJ {"LAMP"} #FIND-OBJ {"RUG"} #FIND-OBJ {"PAPER"}
+       #FIND-OBJ {"SWORD"})
+       LIVING-ROOM}
+
+<ADD-OBJECT
+ #OBJECT {"SWORD"
+         "There is an elvish sword here."
+         "sword"
+         "On hooks above the mantelpiece hangs an elvish sword of great
+antiquity." SWORD () %<> %<+ ,OVISON ,TAKEBIT ,WEAPONBIT> 0 0 0 30 0}
+ ["ORCRI" "GLAMD" "BLADE"] ["ELVIS"]>
+
+<ADD-MELEE <FIND-OBJ "SWORD"> ,SWORD-MELEE>
+
+<ADD-OBJECT
+ #OBJECT {"LAMP"
+         "There is a brass lantern (battery-powered) here."
+         "lamp"
+         "A battery-powered brass lantern is on the trophy case."
+         LANTERN () %<> %<+ ,TAKEBIT ,OVISON> -1 0 0 15 0}
+["LANTE"] ["BRASS"]>
+
+<ADD-OBJECT
+  #OBJECT {"BLAMP"
+          "There is a broken brass lantern here."
+          "broken lamp"
+          %<>
+          %<> () %<> %<+ ,TAKEBIT ,OVISON> 0}
+["LAMP" "LANTE"] ["BROKE"]>
+
+<ADD-OBJECT
+ #OBJECT {"RUG"
+        ""
+        "carpet"
+        %<>
+        RUG () %<> %<+ ,TRYTAKEBIT ,NDESCBIT ,OVISON> 0 0 0 %,BIGFIX 0}
+["CARPE"] ["ORIEN"]>
+
+<ADD-OBJECT
+#OBJECT {"LEAVE"
+         "There is a pile of leaves on the ground."
+         "pile of leaves"
+         %<>
+         LEAF-PILE () %<> %<+ ,BURNBIT ,TAKEBIT ,OVISON> 0 0 0 25 0}
+["LEAF" "PILE"]>
+
+#ROOM {"CELLA"
+       ""
+       "Cellar"
+       %<>
+       #EXIT {"EAST" "MTROL" "SOUTH" "CHAS2"
+             "UP"
+             #CEXIT {"TRAP-DOOR"
+                     "LROOM"
+                     "The trap door has been barred from the other side."}
+             "WEST"
+             #NEXIT "You try to ascend the ramp, but it is impossible, and you slide back down."}
+       (#FIND-OBJ {"TDOOR"})
+       CELLAR
+       25}
+
+<PSETG TCHOMP "The troll fends you off with a menacing gesture.">
+
+#ROOM {"MTROL"
+
+"You are in a small room with passages off in all directions. 
+Bloodstains and deep scratches (perhaps made by an axe) mar the
+walls."
+       "The Troll Room"
+       %<> #EXIT {"WEST" "CELLA"
+                 "EAST" #CEXIT {"TROLL-FLAG" "CRAW4" %,TCHOMP}
+                 "NORTH" #CEXIT {"TROLL-FLAG" "PASS1" %,TCHOMP}
+                 "SOUTH" #CEXIT {"TROLL-FLAG" "MAZE1" %,TCHOMP}}
+       (#FIND-OBJ {"TROLL"})}
+
+<PSETG TROLLDESC
+"A nasty-looking troll, brandishing a bloody axe, blocks all passages
+out of the room.">
+
+<PSETG TROLLOUT
+"An unconscious troll is sprawled on the floor.  All passages out of
+the room are open.">
+
+<SETG VILLAINS (<FIND-OBJ "TROLL"> <FIND-OBJ "THIEF"> <FIND-OBJ "CYCLO">)>
+<SETG VILLAIN-PROBS <IUVECTOR <LENGTH ,VILLAINS> 0>>
+<SETG OPPV <IVECTOR <LENGTH ,VILLAINS> '<>>>
+
+<ADD-DEMON <SETG SWORD-DEMON
+                 <CHTYPE [SWORD-GLOW ,VILLAINS () <1 ,ROOMS> <FIND-OBJ "SWORD"> <>]
+                         HACK>>>
+
+ #OBJECT {"TROLL"
+         %,TROLLDESC
+         "troll"
+         %<>
+         TROLL
+         (#FIND-OBJ {"AXE"}) %<> %<+ ,VICBIT ,OVISON ,VILLAIN> 0 0 0 %,BIGFIX 2}
+
+<ADD-MELEE <FIND-OBJ "TROLL"> ,TROLL-MELEE>
+
+<ADD-DEMON <SETG FIGHT-DEMON
+                <CHTYPE [FIGHTING ,VILLAINS () <1 ,ROOMS> <FIND-OBJ "TROLL"> <>]
+                        HACK>>>
+
+<ADD-OBJECT
+ #OBJECT {"AXE"
+         "There is a bloody axe here."
+         "bloody axe"
+         %<> %<> () %<FIND-OBJ "TROLL"> %<+ ,OVISON ,WEAPONBIT> 0 0 0 25 0}
+ []["BLOOD"]>
+
+<PSETG MAZEDESC "You are in a maze of twisty little passages, all alike.">
+
+<PSETG DEADEND "Dead End">
+
+#ROOM {"MAZE1"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"WEST" "MTROL"
+             "NORTH" "MAZE1"
+             "SOUTH" "MAZE2"
+             "EAST" "MAZE4"} ()}
+
+#ROOM {"MAZE2"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"SOUTH" "MAZE1"
+             "NORTH" "MAZE4"
+             "EAST" "MAZE3"} ()}
+
+#ROOM {"MAZE3"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"WEST" "MAZE2" "NORTH" "MAZE4" "UP" "MAZE5"} ()}
+
+#ROOM {"MAZE4"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"WEST" "MAZE3" "NORTH" "MAZE1" "EAST" "DEAD1"} ()}
+
+#ROOM {"DEAD1"
+       %,DEADEND %,DEADEND %<>
+       #EXIT {"SOUTH" "MAZE4"} ()}
+
+#ROOM {"MAZE5"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"EAST" "DEAD2" "NORTH" "MAZE3" "SW" "MAZE6"}
+       (#FIND-OBJ {"BONES"} #FIND-OBJ {"BAGCO"} #FIND-OBJ {"KEYS"}
+       #FIND-OBJ {"BLANT"} #FIND-OBJ {"RKNIF"})}
+
+<ADD-OBJECT
+ #OBJECT {"RKNIF"
+         "There is a rusty knife here."
+         "rusty knife"
+         "Beside the skeleton is a rusty knife."
+         RUSTY-KNIFE () %<> %<+ ,OVISON ,TAKEBIT ,WEAPONBIT> 0 0 0 20 0}
+ ["KNIFE"] ["RUSTY"]>
+
+<ADD-MELEE <FIND-OBJ "RKNIF"> ,KNIFE-MELEE>
+
+<ADD-OBJECT
+ #OBJECT {"BLANT"
+         "There is a burned-out lantern here."
+         "burned-out lantern"
+         "The deceased adventurer's useless lantern is here."
+         %<> () %<> %<+ ,OVISON ,TAKEBIT> 0 0 0 20 0}
+ ["LANTE" "LAMP"] ["USED" "BURNE" "DEAD" "USELE"]>
+
+#OBJECT {"KEYS"
+        "There is a set of skeleton keys here."
+        "set of skeleton keys"
+        %<> %<> () %<> %<+ ,TOOLBIT ,TAKEBIT ,OVISON> 0 0 0 10 0}
+
+<ADD-OBJECT
+ #OBJECT {"BONES"
+"A skeleton, probably the remains of a luckless adventurer, lies here."
+         "" %<> SKELETON () %<> %<+ ,TRYTAKEBIT ,OVISON> 0 0 0 %,BIGFIX 0}
+["SKELE" "BODY"]>
+
+<ADD-OBJECT
+ #OBJECT {"BAGCO"
+         "An old leather bag, bulging with coins, is here."
+         "bag of coins"
+         %<> %<> () %<> %<+ ,TAKEBIT ,OVISON> 0 10 5 15 0}
+["BAG" "COINS"] ["LEATH"]>
+
+<ADD-OBJECT 
+ #OBJECT {"BAR"
+         "There is a large platinum bar here."
+         "platinum bar"
+         %<> %<> () %<> %<+ ,SACREDBIT ,TAKEBIT ,OVISON> 0 12 10 20 0}
+["PLATI"]>
+
+<ADD-OBJECT
+ #OBJECT {"PEARL"
+         "There is a pearl necklace here with hundreds of large pearls."
+         "pearl necklace"
+         %<> %<> () %<> %<+ ,TAKEBIT ,OVISON> 0 9 5 10 0}
+["NECKL"]>
+
+#ROOM {"DEAD2"
+       %,DEADEND %,DEADEND %<>
+       #EXIT {"WEST" "MAZE5"} ()}
+
+#ROOM {"MAZE6"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"DOWN" "MAZE5" "EAST" "MAZE7" "WEST" "MAZE6" "UP" "MAZE9"} ()}
+
+#ROOM {"MAZE7"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"UP" "MAZ14" "WEST" "MAZE6" "NE" "DEAD1" "EAST" "MAZE8" "SOUTH" "MAZ15"}
+       ()}
+
+#ROOM {"MAZE8"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"NE" "MAZE7" "WEST" "MAZE8" "SE" "DEAD3"} ()}
+
+#ROOM {"DEAD3"
+       %,DEADEND %,DEADEND %<>
+       #EXIT {"NORTH" "MAZE8"} ()}
+
+#ROOM {"MAZE9"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"NORTH" "MAZE6" "EAST" "MAZ11" "DOWN" "MAZ10" "SOUTH" "MAZ13"
+             "WEST" "MAZ12" "NW" "MAZE9"} ()}
+
+#ROOM {"MAZ10"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"EAST" "MAZE9" "WEST" "MAZ13" "UP" "MAZ11"} ()}
+
+#ROOM {"MAZ11"
+       %,MAZEDESC
+       %,MAZEDESC
+       %<>
+       #EXIT {"NE" "MGRAT" "DOWN" "MAZ10" "NW" "MAZ13" "SW" "MAZ12"}}
+             
+#ROOM {"MGRAT"
+       ""
+       "Grating Room" %<>
+       #EXIT {"SW" "MAZ11" "UP" #CEXIT {"KEY-FLAG" "CLEAR" "The grating is locked"}}
+       (#FIND-OBJ {"GRAT2"}) MAZE-11}
+
+#ROOM {"MAZ12"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"WEST" "MAZE5" "SW" "MAZ11" "EAST" "MAZ13" "UP" "MAZE9" "NORTH" "DEAD4"} ()}
+
+#ROOM {"DEAD4"
+       %,DEADEND %,DEADEND %<>
+       #EXIT {"SOUTH" "MAZ12"} ()}
+
+#ROOM {"MAZ13"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"EAST" "MAZE9" "DOWN" "MAZ12" "SOUTH" "MAZ10" "WEST" "MAZ11"} ()}
+
+#ROOM {"MAZ14"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"WEST" "MAZ15" "NW" "MAZ14" "NE" "MAZE7" "SOUTH" "MAZE7"}}
+
+#ROOM {"MAZ15"
+       %,MAZEDESC %,MAZEDESC %<>
+       #EXIT {"WEST" "MAZ14" "SOUTH" "MAZE7" "NE" "CYCLO"}}
+
+<PSETG STFORE        "You are in a forest, with trees in all directions around you.">
+
+#ROOM {"FORE1"
+       %,STFORE
+       %,FOREST T
+       #EXIT {"NORTH" "FORE1" "EAST" "FORE3" "SOUTH" "FORE2" "WEST" "FORE1"} ()}
+
+#ROOM {"FORE4"
+       "You are in a large forest, with trees obstructing all views except
+to the east, where a small clearing may be seen through the trees."
+       %,FOREST
+       T
+       #EXIT {"EAST" "CLTOP" "NORTH" "FORE5" "SOUTH" "FORE4" "WEST" "FORE2"}}
+
+#ROOM {"FORE5"
+       %,STFORE
+       %,FOREST
+       T
+       #EXIT {"NORTH" "FORE5" "SE" "CLTOP" "SOUTH" "FORE4" "WEST" "FORE2"}}
+
+<PSETG FORDES
+"You are in a dimly lit forest, with large trees all around.  To the
+east, there appears to be sunlight.">
+
+#ROOM {"FORE2"
+       %,FORDES
+       %,FOREST T
+       #EXIT {"NORTH" "SHOUS" "EAST" "CLEAR" "SOUTH" "FORE4" "WEST" "FORE1"} ()}
+
+#ROOM {"FORE3"
+       %,FORDES
+       %,FOREST T
+       #EXIT {"NORTH" "FORE2" "EAST" "CLEAR" "SOUTH" "CLEAR" "WEST" "NHOUS"} ()}
+
+#ROOM {"CLEAR"
+       ""
+       "Clearing" T
+       #EXIT {"SW" "EHOUS" "SE" "FORE5" "NORTH" "CLEAR" "EAST" "CLEAR"
+             "WEST" "FORE3" "SOUTH" "FORE2" "DOWN" #CEXIT {"KEY-FLAG" "MGRAT"}}
+       (#FIND-OBJ {"GRAT1"} #FIND-OBJ {"LEAVE"}) CLEARING}
+
+#ROOM {"RAVI1"
+
+"You are in a deep ravine at a crossing with an east-west crawlway. 
+Some stone steps are at the south of the ravine and a steep staircase
+descends."
+       "Deep Ravine"
+       %<>
+       #EXIT {"SOUTH" "PASS1" "DOWN" "RESES" "EAST" "CHAS1" "WEST" "CRAW1"}}
+
+#ROOM {"CRAW1"
+
+"You are in a crawlway with a three-foot high ceiling.  Your footing
+is very unsure here due to the assortment of rocks underfoot. 
+Passages can be seen in the east, west, and northwest corners of the
+passage."
+       "Rocky Crawl"
+       %<>
+       #EXIT {"WEST" "RAVI1" "EAST" "DOME" "NW" "EGYPT"}}
+
+#ROOM {"RESES"
+       ""
+       "Reservoir South"
+       %<>
+       #EXIT {"SOUTH" #CEXIT {"EGYPT-FLAG"
+                             "RAVI1"
+                             "The coffin will not fit through this passage."
+                             T
+                             COFFIN-CURE}
+             "WEST" "STREA"
+             "CROSS" #CEXIT {"LOW-TIDE" "RESEN" "You are not equipped for swimming."}
+             "NORTH" #CEXIT {"LOW-TIDE" "RESEN" "You are not equipped for swimming."}
+             "UP" #CEXIT {"EGYPT-FLAG"
+                          "CANY1"
+                          "The stairs are too steep for carrying the coffin."
+                          T
+                          COFFIN-CURE}}
+       (#FIND-OBJ {"TRUNK"})
+       RESERVOIR-SOUTH}
+
+#ROOM {"RESEN"
+       ""
+       "Reservoir North"
+       %<>
+       #EXIT {"NORTH" "ATLAN"
+             "CROSS" #CEXIT {"LOW-TIDE" "RESES" "You are not equipped for swimming."}
+             "SOUTH" #CEXIT {"LOW-TIDE" "RESES" "You are not equipped for swimming."}}
+       (#FIND-OBJ {"PUMP"})
+       RESERVOIR-NORTH}
+
+#ROOM {"STREA"
+
+"You are standing on a path beside a flowing stream.  The path
+travels to the north and the east."
+       "Stream"
+       %<>
+       #EXIT {"EAST" "RESES" "NORTH" "ICY"}
+       (#FIND-OBJ {"FUSE"})}
+
+#ROOM {"EGYPT"
+"You are in a room which looks like an Egyptian tomb.  There is an
+ascending staircase in the room as well as doors, east and south."
+       "Egyptian Room"
+       %<>
+       #EXIT {"UP" "ICY" "SOUTH" "LEDG3"
+             "EAST" #CEXIT {"EGYPT-FLAG" "CRAW1"
+                            "The passage is too narrow to accomodate coffins." T
+                            COFFIN-CURE}}
+       (#FIND-OBJ {"COFFI"})}
+
+#ROOM {"ICY"
+       ""
+       "Glacier Room"
+       %<>
+       #EXIT {"NORTH" "STREA" "EAST" "EGYPT" "WEST" #CEXIT {"GLACIER-FLAG" "RUBYR"}}
+       (#FIND-OBJ {"ICE"})
+       GLACIER-ROOM}
+
+<ADD-OBJECT
+ #OBJECT {"REFL1"
+         ""
+         "mirror"
+         %<> MIRROR-MIRROR () %<> %<+ ,TRYTAKEBIT ,VICBIT ,OVISON> 0 0 0 %,BIGFIX 0}
+ ["MIRRO"]>
+
+<ADD-OBJECT
+ #OBJECT {"REFL2"
+         ""
+         "mirror"
+         %<> MIRROR-MIRROR () %<> %<+ ,TRYTAKEBIT ,VICBIT ,OVISON> 0 0 0 %,BIGFIX 0}
+ ["MIRRO"]>
+
+<ADD-OBJECT
+ #OBJECT {"ICE"
+         "A mass of ice fills the western half of the room."
+         "glacier" %<> GLACIER ()  %<> %<+ ,VICBIT ,OVISON> 0 0 0 %,BIGFIX 0}
+["GLACI"]>
+
+#ROOM {"RUBYR"
+"You are in a small chamber behind the remains of the Great Glacier.
+To the south and west are small passageways."
+       "Ruby Room"
+       %<>
+       #EXIT {"WEST" "LAVA" "SOUTH" "ICY"}
+       (#FIND-OBJ {"RUBY"})}
+
+#ROOM {"ATLAN"
+       "You are in an ancient room, long buried by the Reservoir.  There are
+exits here to the southeast and upward."
+       "Atlantis Room"
+       %<>
+       #EXIT {"SE" "RESEN" "UP" "CAVE1"}
+       (#FIND-OBJ {"TRIDE"})}
+
+#ROOM {"CANY1"
+"You are on the south edge of a deep canyon.  Passages lead off
+to the east, south, and northwest.  You can hear the sound of
+flowing water below."
+       "Deep Canyon"
+       %<>
+       #EXIT {"NW" "RESES" "EAST" "DAM" "SOUTH" "CAROU"}}
+
+#ROOM {"ECHO"
+"You are in a large room with a ceiling which cannot be detected from
+the ground. There is a narrow passage from east to west and a stone
+stairway leading upward.  The room is extremely noisy.  In fact, it is
+difficult to hear yourself think."
+       "Loud Room"
+       %<>
+       #EXIT {"EAST" "CHAS3" "WEST" "PASS5" "UP" "CAVE3"}
+       (#FIND-OBJ {"BAR"})
+       ECHO-ROOM}
+
+ #OBJECT {"RUBY"
+         "There is a moby ruby lying here."
+         "ruby"
+         "On the floor lies a moby ruby."
+         %<>
+         ()
+         %<>
+         %<+ ,TAKEBIT ,OVISON>
+         0
+         15
+         8
+         5
+         0}
+
+<ADD-OBJECT
+ #OBJECT {"TRIDE"
+         "Neptune's own crystal trident is here."
+         "crystal trident"
+         "On the shore lies Neptune's own crystal trident."
+         %<> () %<> %<+ ,TAKEBIT ,OVISON> 0 4 11 20 0}
+["FORK"] ["CRYST"]>
+
+<ADD-OBJECT
+ #OBJECT {"COFFI"
+"There is a solid-gold coffin, used for the burial of Ramses II, here."
+         "gold coffin"
+         %<> %<> () %<> %<+ ,CONTBIT ,SACREDBIT ,TAKEBIT ,OVISON> 0 3 7 55 35}
+["CASKE"] ["GOLD"]>
+
+<ADD-OBJECT
+ #OBJECT {"TORCH"
+         "There is an ivory torch here."
+         "torch"
+         "Sitting on the pedestal is a flaming torch, made of ivory."
+         %<> () %<> %<+ ,TOOLBIT ,FLAMEBIT ,TAKEBIT ,OVISON> 1 14 6 20 0}
+[] ["IVORY"]>
+
+#ROOM {"MIRR1"
+       ""
+       "Mirror Room"
+       %<>
+       #EXIT {"WEST" "PASS3" "NORTH" "CRAW2" "EAST" "CAVE1"}
+       (#FIND-OBJ {"REFL1"})
+       MIRROR-ROOM}
+
+#ROOM {"MIRR2"
+       ""
+       "Mirror Room"
+       T
+       #EXIT {"WEST" "PASS4" "NORTH" "CRAW3" "EAST" "CAVE2"}
+       (#FIND-OBJ {"REFL2"})
+       MIRROR-ROOM}
+
+#ROOM {"CAVE1"
+"You are in a small cave with an entrance to the north and a stairway
+leading down."
+       "Cave"
+       %<>
+       #EXIT {"NORTH" "MIRR1" "DOWN" "ATLAN"}}
+
+#ROOM {"CAVE2"
+"You are in a tiny cave with entrances west and north, and a dark,
+forbidding staircase leading down."
+       "Cave"
+       %<>
+       #EXIT {"NORTH" "CRAW3" "WEST" "MIRR2" "DOWN" "LLD1"} () CAVE2-ROOM}
+
+#ROOM {"CRAW2"
+"You are in a steep and narrow crawlway.  There are two exits nearby to
+the south and southwest."
+       "Steep Crawlway"
+       %<>
+       #EXIT {"SOUTH" "MIRR1" "SW" "PASS3"}}
+
+#ROOM {"CRAW3"
+"You are in a narrow crawlway.  The crawlway leads from north to south.
+However the south passage divides to the south and southwest."
+      "Narrow Crawlway"
+       %<>
+       #EXIT {"SOUTH" "CAVE2" "SW" "MIRR2" "NORTH" "MGRAI"}}
+
+#ROOM {"PASS3"
+"You are in a cold and damp corridor where a long east-west passageway
+intersects with a northward path."
+       "Cold Passage"
+       %<>
+       #EXIT {"EAST" "MIRR1" "WEST" "SLIDE" "NORTH" "CRAW2"}}
+
+#ROOM {"PASS4"
+
+"You are in a winding passage.  It seems that there is only an exit
+on the east end although the whirring from the round room can be
+heard faintly to the north."
+       "Winding Passage"
+       %<>
+       #EXIT {"EAST" "MIRR2" "NORTH"
+ #NEXIT "You hear the whir of the carousel room but can find no entrance."}}
+
+#ROOM {"SLIDE" 
+
+"You are in a small chamber, which appears to have been part of a
+coal mine. On the south wall of the chamber the letters \"Granite
+Wall\" are etched in the rock. To the east is a long passage and
+there is a steep metal slide twisting downward. From the appearance
+of the slide, an attempt to climb up it would be impossible.  To the
+north is a small opening."
+       "Slide Room"
+       %<>
+       #EXIT {"EAST" "PASS3" "DOWN" "CELLA" "NORTH" "ENTRA"}}
+
+#ROOM {"ENTRA"
+
+"You are standing at the entrance of what might have been a coal
+mine. To the northeast and the northwest are entrances to the mine,
+and there is another exit on the south end of the room."
+       "Mine Entrance"
+       %<>
+       #EXIT {"SOUTH" "SLIDE" "NW" "SQUEE" "NE" "TSHAF"}}
+
+#ROOM {"SQUEE"
+"You are a small room.  Strange squeaky sounds may be heard coming from
+the passage at the west end.  You may also escape to the south."
+       "Squeaky Room"
+       %<>
+       #EXIT {"WEST" "BATS" "SOUTH" "ENTRA"}}
+
+#ROOM {"TSHAF"
+       "You are in a large room, in the middle of which is a small shaft
+descending through the floor into darkness below.  To the west and
+the north are exits from this room.  Constructed over the top of the
+shaft is a metal framework to which a heavy iron chain is attached."
+       "Shaft Room"
+       %<>
+       #EXIT {"DOWN" #NEXIT "You wouldn't fit and would die if you could."
+             "WEST" "ENTRA" "NORTH" "TUNNE"}
+       (#FIND-OBJ {"TBASK"})}
+
+<PUT <ADD-OBJECT 
+ #OBJECT {"TBASK"
+         "At the end of the chain is a basket."
+         "basket"
+         %<>
+         DUMBWAITER () %<> %<+ ,CONTBIT ,OVISON ,TRANSBIT> 0 0 0 %,BIGFIX 50}
+["CAGE" "DUMBW" "BASKE"]> ,OOPEN? T>
+
+<ADD-OBJECT
+ #OBJECT {"FBASK"
+         "" 
+         ""
+         %<>
+         DUMBWAITER () %<> %,OVISON 0 0 0 %,BIGFIX 0}
+["CAGE" "DUMBW" "BASKE"]>
+
+#ROOM {"TUNNE"
+
+"You are in a narrow tunnel with large wooden beams running across
+the ceiling and around the walls.  A path from the south splits into
+paths running west and northeast."
+       "Wooden Tunnel"
+       %<>
+       #EXIT {"SOUTH" "TSHAF" "WEST" "SMELL" "NE" "MINE1"}}
+
+#ROOM {"SMELL"
+
+"You are in a small non-descript room.  However, from the direction
+of a small descending staircase a foul odor can be detected.  To the
+east is a narrow path."
+       "Smelly Room"
+       %<>
+       #EXIT {"DOWN" "BOOM" "EAST" "TUNNE"}}
+
+#ROOM {"BOOM"
+       "You are in a small room which smells strongly of coal gas."
+       "Gas Room"
+       %<>
+       #EXIT {"UP" "SMELL"}
+       (#FIND-OBJ {"BRACE"})
+       BOOM-ROOM}
+
+<ADD-OBJECT
+ #OBJECT {"BRACE"
+         "There is a sapphire-encrusted bracelet here."
+         "sapphire bracelet"
+         %<> %<> () %<> %<+ ,TAKEBIT ,OVISON> 0 5 3 10 0}
+["JEWEL"] ["SAPPH"]>
+
+#ROOM {"TLADD"
+
+"You are in a very small room.  In the corner is a rickety wooden
+ladder, leading downward.  It might be safe to descend.  There is
+also a staircase leading upward."
+       "Ladder Top"
+       %<>
+       #EXIT {"DOWN" "BLADD" "UP" "MINE7"}}
+
+<PSETG MINDESC 
+"You are in a non-descript part of a coal mine.">
+
+#ROOM {"MINE1"
+       %,MINDESC
+       %,MINDESC
+       %<>
+       #EXIT {"NORTH" "MINE4" "SW" "MINE2" "EAST" "TUNNE"}}
+
+#ROOM {"MINE2"
+       %,MINDESC
+       %,MINDESC
+       %<>
+       #EXIT {"SOUTH" "MINE1" "WEST" "MINE5" "UP" "MINE3" "NE" "MINE4"}}
+
+#ROOM {"MINE3"
+       %,MINDESC
+       %,MINDESC
+       %<>
+       #EXIT {"WEST" "MINE2" "NE" "MINE5" "EAST" "MINE5"}}
+
+#ROOM {"MINE4"
+       %,MINDESC
+       %,MINDESC
+       %<>
+       #EXIT {"UP" "MINE5" "NE" "MINE6" "SOUTH" "MINE1" "WEST" "MINE2"}}
+
+#ROOM {"MINE5"
+       %,MINDESC
+       %,MINDESC
+       %<>
+       #EXIT {"DOWN" "MINE6" "NORTH" "MINE7" "WEST" "MINE2" "SOUTH" "MINE3"
+              "UP" "MINE3" "EAST" "MINE4"}}
+
+#ROOM {"MINE6"
+       %,MINDESC
+       %,MINDESC
+       %<>
+       #EXIT {"SE" "MINE4" "UP" "MINE5" "NW" "MINE7"}}
+
+#ROOM {"MINE7"
+       %,MINDESC
+       %,MINDESC
+       %<>
+       #EXIT {"EAST" "MINE1" "WEST" "MINE5" "DOWN" "TLADD" "SOUTH" "MINE6"}}
+
+#ROOM {"BLADD"
+
+"You are in a rather wide room.  On one side is the bottom of a
+narrow wooden ladder.  To the northeast and the south are passages
+leaving the room."
+       "Ladder Bottom"
+       %<>
+       #EXIT {"NE" "DEAD7" "SOUTH" "TIMBE" "UP" "TLADD"}}
+
+#ROOM {"DEAD7"
+       "Dead End"
+       "Dead End"
+       %<>
+       #EXIT {"SOUTH" "BLADD"} (#FIND-OBJ {"COAL"})}
+
+<PSETG NOFIT "You cannot fit through this passage with that load.">
+
+#ROOM {"TIMBE"
+"You are in a long and narrow passage, which is cluttered with broken
+timbers.  A wide passage comes from the north and turns at the 
+southwest corner of the room into a very narrow passageway."
+       "Timber Room"
+       %<>
+       #EXIT {"NORTH" "BLADD"
+             "SW" #CEXIT {"EMPTY-HANDED" "BSHAF" %,NOFIT}} () NO-OBJS}
+
+#ROOM {"BSHAF" 
+
+"You are in a small square room which is at the bottom of a long
+shaft. To the east is a passageway and to the northeast a very narrow
+passage. In the shaft can be seen a heavy iron chain."
+       "Lower Shaft"
+       %<>
+       #EXIT {"EAST" "MACHI"
+             "OUT" #CEXIT {"EMPTY-HANDED" "TIMBE" %,NOFIT}
+             "NE" #CEXIT {"EMPTY-HANDED" "TIMBE" %,NOFIT}
+             "UP" #NEXIT "Not a chance."
+             "CLIMB" #NEXIT "The chain is not climbable."}
+       (#FIND-OBJ {"FBASK"}) NO-OBJS}
+
+#ROOM {"MACHI"
+       ""
+       "Machine Room"
+       %<>
+       #EXIT {"NW" "BSHAF"} (#FIND-OBJ {"MSWIT"} #FIND-OBJ {"MACHI"}) MACHINE-ROOM}
+
+#ROOM {"BATS" "" "Bat Room" %<> #EXIT {"EAST" "SQUEE"} 
+       (#FIND-OBJ {"JADE"} #FIND-OBJ {"BAT"}) BATS-ROOM}
+
+#ROOM {"DOME"
+       ""
+       "Dome Room"
+       %<>
+       #EXIT {"EAST" "CRAW1"
+             "DOWN" #CEXIT {"DOME-FLAG"
+                            "MTORC"
+                            "You cannot go down without fracturing many bones."}
+             "CLIMB" #CEXIT {"DOME-FLAG"
+                             "MTORC"
+                             "You cannot go down without fracturing many bones."}}
+       (#FIND-OBJ {"RAILI"})
+       DOME-ROOM}
+
+#ROOM {"MTORC"
+       ""
+       "Torch Room"
+       %<>
+       #EXIT {"UP" #NEXIT "You cannot reach the rope." "WEST" "MTORC" "DOWN" "CRAW4"}
+       (#FIND-OBJ {"TORCH"})
+       TORCH-ROOM}
+
+#ROOM {"CRAW4"
+"You are in a north-south crawlway; a passage goes to the east also.
+There is a hole above, but it provides no opportunities for climbing."
+       "North-South Crawlway"
+       %<>
+       #EXIT {"NORTH" "CHAS2" "SOUTH" "STUDI" "EAST" "MTROL"
+             "UP" #NEXIT "Not even a human fly could get up it."} ()}
+
+#ROOM {"CHAS2"
+
+"You are on the west edge of a chasm, the bottom of which cannot be
+seen. The east side is sheer rock, providing no exits.  A narrow
+passage goes west, and the path you are on continues to the north and
+south."
+       "West of Chasm"
+       %<> #EXIT {"WEST" "CELLA" "NORTH" "CRAW4" "SOUTH" "GALLE"
+                 "DOWN" #NEXIT "The chasm probably leads straight to the infernal regions."} ()}
+
+#ROOM {"CAROU"
+       ""
+       "Round room" %<>
+       #EXIT {"NORTH" #CEXIT {"CAROUSEL-FLIP" "CAVE4" "" %<> CAROUSEL-EXIT}
+             "SOUTH" #CEXIT {"CAROUSEL-FLIP" "CAVE4" "" %<> CAROUSEL-EXIT}
+             "EAST" #CEXIT {"CAROUSEL-FLIP" "MGRAI" "" %<> CAROUSEL-EXIT}
+             "WEST" #CEXIT {"CAROUSEL-FLIP" "PASS1" "" %<> CAROUSEL-EXIT}
+             "NW" #CEXIT {"CAROUSEL-FLIP" "CANY1" "" %<> CAROUSEL-EXIT}
+             "NE" #CEXIT {"CAROUSEL-FLIP" "PASS5" "" %<> CAROUSEL-EXIT}
+             "SE" #CEXIT {"CAROUSEL-FLIP" "PASS4" "" %<> CAROUSEL-EXIT}
+             "SW" #CEXIT {"CAROUSEL-FLIP" "MAZE1" "" %<> CAROUSEL-EXIT}
+             "EXIT" #CEXIT {"CAROUSEL-FLIP" "PASS3" "" %<> CAROUSEL-OUT}}
+       (#FIND-OBJ {"IRBOX"}) CAROUSEL-ROOM}
+
+<ADD-OBJECT
+ #OBJECT {"IRBOX"
+         "There is a dented iron box here."
+         "iron box"
+         %<> %<> (#FIND-OBJ {"STRAD"}) %<> %<+ ,TAKEBIT ,CONTBIT> 0 0 0 40 20}
+ ["BOX"] ["IRON" "DENTE"]>
+
+<ADD-OBJECT
+ #OBJECT {"STRAD"
+         "There is a Stradavarius here."
+         "fancy violin"
+         %<> %<> () #FIND-OBJ {"IRBOX"} %<+ ,OVISON ,TAKEBIT> 0 10 10 10 0}
+ ["VIOLI"] ["FANCY"]>
+
+#ROOM {"PASS5"
+       "You are in a high north-south passage, which forks to the northeast."
+       "North-South Passage"
+       %<>
+       #EXIT {"NORTH" "CHAS1" "NE" "ECHO" "SOUTH" "CAROU"} ()}
+
+#ROOM {"CHAS1"
+"A chasm runs southwest to northeast.  You are on the south edge; the
+path exits to the south and to the east."
+       "Chasm"
+       %<> #EXIT {"SOUTH" "RAVI1" "EAST" "PASS5"
+                 "DOWN" #NEXIT "Are you out of your mind?"} ()}
+
+#ROOM {"CAVE3"
+
+"You are in a cave.  Passages exit to the south and to the east, but
+the cave narrows to a crack to the west.  The earth is particularly
+damp here."
+       "Damp Cave"
+       %<> #EXIT {"SOUTH" "ECHO" "EAST" "DAM"
+                 "WEST" #NEXIT "It is too narrow for most insects."}
+       ()}
+
+#ROOM {"CHAS3"
+"A chasm, evidently produced by an ancient river, runs through the
+cave here.  Passages lead off in all directions."
+       "Ancient Chasm"
+       %<> #EXIT {"SOUTH" "ECHO" "EAST" "TCAVE" "NORTH" "DEAD5" "WEST" "DEAD6"} ()}
+
+#ROOM {"DEAD5"
+       "Dead end"
+       "Dead end"
+       %<> #EXIT {"SW" "CHAS3"} ()}
+
+#ROOM {"DEAD6"
+       "Dead end"
+       "Dead end" %<> #EXIT {"EAST" "CHAS3"} ()}
+
+#ROOM {"CAVE4"
+"You have entered a cave with passages leading north and southeast."
+       "Engravings Cave"
+       %<> #EXIT {"NORTH" "CAROU" "SE" "RIDDL"} (#FIND-OBJ {"ENGRA"})}
+
+<ADD-OBJECT <SOBJECT "ENGRA" "wall with engravings" ,OVISON ,READBIT
+        ,SACREDBIT>
+           ["INSCR"] ["OLD" "ANCIE"]>
+
+<PUT <FIND-OBJ "ENGRA"> ,ODESC1 "There are old engravings on the walls here.">
+
+#ROOM {"RIDDL"
+
+"This is a room which is bare on all sides.  There is an exit down. 
+To the east is a great door made of stone.  Above the stone, the
+following words are written: 'No man shall enter this room without
+solving this riddle:
+  What is tall as a house,
+         round as a cup, 
+         and all the king's horses can't draw it up?'"
+       "Riddle Room"
+       %<>
+       #EXIT {"DOWN" "CAVE4"
+             "EAST" #CEXIT {"RIDDLE-FLAG" "MPEAR"
+                            "Your way is blocked by an invisible force."}}
+       (#FIND-OBJ {"SDOOR"})}
+
+#ROOM {"MPEAR"
+"This is a former broom closet.  The exits are to the east and west."
+       "Pearl Room"
+       %<> #EXIT {"EAST" "BWELL" "WEST" "RIDDL"} (#FIND-OBJ {"PEARL"})}
+
+#ROOM {"LLD1"
+       ""
+       "Entrance to Hades"
+       T #EXIT {"EAST"
+               #CEXIT {"LLD-FLAG"
+                       "LLD2"
+                       "Some invisible force prevents you from passing through the gate."}
+               "UP" "CAVE2"
+               "ENTER"
+               #CEXIT {"LLD-FLAG"
+                       "LLD2"
+                       "Some invisible force prevents you from passing through the gate."}}
+       (#FIND-OBJ {"CORPS"} #FIND-OBJ {"GATES"} #FIND-OBJ {"GHOST"}) LLD-ROOM}
+
+<ADD-OBJECT
+ #OBJECT {"GHOST"
+         ""
+         "" %<> GHOST-FUNCTION () %<> %<+ ,VICBIT ,OVISON> 0 0 0
+         %,BIGFIX 0}
+["SPIRI" "FIEND"]>      
+
+#ROOM {"LLD2"
+       ""
+       "Land of the Living Dead"
+       T #EXIT {"EAST" "TOMB"
+               "EXIT" "LLD1" "WEST" "LLD1"} (#FIND-OBJ {"BODIE"}) LLD2-ROOM 30}
+
+#ROOM {"MGRAI"
+"You are standing in a small circular room with a pedestal.  A set of
+stairs leads up, and passages leave to the east and west."
+       "Grail Room"
+       %<> #EXIT {"WEST" "CAROU" "EAST" "CRAW3" "UP" "TEMP1"}
+       (#FIND-OBJ {"GRAIL"})}
+
+<ADD-OBJECT
+ #OBJECT {"GRAIL"
+         "There is an extremely valuable (perhaps original) grail here."
+         "grail" %<> %<> () %<> %<+ ,CONTBIT ,TAKEBIT ,OVISON> 0 2 5 10 5}[]>
+
+#ROOM {"TEMP1"
+
+"You are in the west end of a large temple.  On the south wall is an 
+ancient inscription, probably a prayer in a long-forgotten language. 
+The north wall is solid granite.  The entrance at the west end of the
+room is through huge marble pillars."
+       "Temple"
+       T #EXIT {"WEST" "MGRAI" "EAST" "TEMP2"}
+       (#FIND-OBJ {"PRAYE"} #FIND-OBJ {"BELL"})}
+
+<ADD-OBJECT <SOBJECT "PRAYE" "prayer" <+ ,READBIT ,SACREDBIT ,OVISON>>
+           ["INSCR"] ["ANCIE" "OLD"]>
+
+#ROOM {"TEMP2"
+"You are in the east end of a large temple.  In front of you is what
+appears to be an altar."
+       "Altar"
+       T #EXIT {"WEST" "TEMP1"}
+       (#FIND-OBJ {"BOOK"} #FIND-OBJ {"CANDL"})}
+
+<ADD-OBJECT
+ #OBJECT {"TRUNK"
+         "There is an old trunk here, bulging with assorted jewels."
+         "trunk with jewels"
+         "Lying half buried in the mud is an old trunk, bulging with jewels."
+          %<> () %<> %,TAKEBIT 0 15 8 35 0}
+["CHEST"]>
+
+<ADD-OBJECT
+ #OBJECT {"BELL"
+         "There is a small brass bell here."
+         "bell"
+         "Lying in a corner of the room is a small brass bell."
+         %<> () %<> %<+ ,TAKEBIT ,OVISON> 0 0 0 5 0}
+[] ["BRASS"]>
+
+<ADD-OBJECT
+ #OBJECT {"BOOK"
+         "There is a large black book here."
+         "book"
+         "On the altar is a large black book, open to page 569."
+         BLACK-BOOK () %<> %<+ ,BURNBIT ,TAKEBIT ,OVISON ,READBIT> 0 0 0 10 0}
+["PRAYE" "BIBLE" "GOODB"] ["BLACK"]>
+
+<ADD-OBJECT 
+ #OBJECT {"CANDL"
+         "There are two candles here."
+         "pair of candles"
+         "On the two ends of the altar are burning candles."
+         CANDLES () %<> %<+ ,FLAMEBIT ,TAKEBIT ,OVISON> 1 0 0 10 0}[]>
+
+#ROOM {"DAM"
+       ""
+       "Dam"
+       T #EXIT {"SOUTH" "CANY1" "DOWN" "DOCK" "EAST" "CAVE3" "NORTH" "LOBBY"}
+       (#FIND-OBJ {"BOLT"} #FIND-OBJ {"DAM"} #FIND-OBJ {"BUBBL"}) DAM-ROOM}
+
+#ROOM {"LOBBY"
+"This room appears to have been the waiting room for groups touring
+the dam.  There are exits here to the north and east marked
+'Private', though the doors are open, and an exit to the south."
+       "Dam Lobby"
+       T
+       #EXIT {"SOUTH" "DAM"
+             "NORTH" "MAINT"
+             "EAST" "MAINT"}
+       (#FIND-OBJ {"MATCH"} #FIND-OBJ {"GUIDE"})}
+
+<ADD-OBJECT
+ #OBJECT {"GUIDE"
+         "There are tour guidebooks here."
+         "tour guidebook"
+"Some guidebooks entitled 'Flood Control Dam #3' are on the reception
+desk." %<> () %<> %<+ ,BURNBIT ,TAKEBIT ,READBIT ,OVISON>
+          0 0 0 5 0}
+["BOOK"] ["TOUR"]>
+
+<ADD-OBJECT
+ #OBJECT {"PAPER"
+         ""
+         "newspaper"
+         %<> %<> () %<> %<+ ,BURNBIT ,TAKEBIT ,READBIT ,OVISON> 0 0 0 2 0}
+["NEWSP" "ISSUE" "REPOR" "MAGAZ" "NEWS"]>        
+
+#ROOM {"MAINT"
+
+"You are in what appears to have been the maintenance room for Flood
+Control Dam #3, judging by the assortment of tool chests around the
+room.  Apparently, this room has been ransacked recently, for most of
+the valuable equipment is gone. On the wall in front of you is a
+panel of buttons, which are labelled in EBCDIC. However, they are of
+different colors:  Blue, Yellow, Brown, and Red. The doors to this
+room are in the west and south ends."
+       "Maintenance Room"
+       %<> #EXIT {"SOUTH" "LOBBY" "WEST" "LOBBY"}
+       (#FIND-OBJ {"LEAK"} #FIND-OBJ {"TUBE"} #FIND-OBJ {"WRENC"}
+       #FIND-OBJ {"BLBUT"} #FIND-OBJ {"RBUTT"} #FIND-OBJ {"BRBUT"}
+       #FIND-OBJ {"YBUTT"} #FIND-OBJ {"SCREW"}) MAINT-ROOM}
+
+<ADD-OBJECT
+ #OBJECT {"MATCH"
+         "There is a matchbook whose cover says 'Visit Beautiful FCD#3' here."
+         "matchbook"
+         %<> MATCH-FUNCTION () %<> %<+ ,TAKEBIT ,OVISON ,READBIT> 0 0 0 2 0}
+["FLINT"]>
+
+<ADD-OBJECT
+ #OBJECT {"ADVER"
+         "There is a small leaflet here."
+         "leaflet"
+         %<> %<> () #FIND-OBJ {"MAILB"} %<+ ,BURNBIT ,TAKEBIT ,OVISON ,READBIT>
+         0 0 0 2 0}
+["PAMPH" "LEAFL" "BOOKL"]>
+
+<ADD-OBJECT 
+ #OBJECT {"MAILB"
+         "There is a small mailbox here."
+         "mailbox"
+         %<> %<> (#FIND-OBJ {"ADVER"}) %<> %<+ ,CONTBIT ,OVISON> 0 0 0 %,BIGFIX 10}[
+ "BOX"]>
+
+ #OBJECT {"TUBE"
+         "There is an object which looks like a tube of toothpaste here."
+         "tube"
+         %<> TUBE-FUNCTION (#FIND-OBJ {"PUTTY"}) %<> %<+ ,CONTBIT ,TAKEBIT ,OVISON> 0 0 0 10 7}
+
+<ADD-OBJECT
+ #OBJECT {"PUTTY"
+         "There is some gunk here"
+         "viscous material"
+         %<> %<> () #FIND-OBJ {"TUBE"} %<+ ,TOOLBIT ,TAKEBIT ,OVISON> 0 0 0 6 0}
+ ["MATER" "GUNK" "GLUE"] ["VISCO"]>
+
+<ADD-OBJECT
+ #OBJECT {"WRENC"
+         "There is a wrench here."
+         "wrench"
+         %<> %<> () %<> %<+ ,TOOLBIT ,TAKEBIT ,OVISON> 0 0 0 10 0}[]>
+
+<ADD-OBJECT 
+ #OBJECT {"SCREW"
+         "There is a screwdriver here."
+         "screwdriver"
+         %<> %<> () %<> %<+ ,TOOLBIT ,TAKEBIT ,OVISON> 0 0 0 5 0}[]>
+
+
+#ROOM {"CYCLO"
+       "" "Cyclops Room"
+       %<> #EXIT {"WEST" "MAZ15" "NORTH" #CEXIT {"MAGIC-FLAG" "BLROO" "The north wall is solid rock."}
+                 "UP" #CEXIT {"CYCLOPS-FLAG" "TREAS" "The cyclops doesn't look like he'll let you past."}}
+       (#FIND-OBJ {"CYCLO"}) CYCLOPS-ROOM}
+
+<ADD-MELEE <FIND-OBJ "CYCLO"> ,CYCLOPS-MELEE>
+
+#ROOM {"BLROO"
+"You are in a long passage.  To the south is one entrance.  On the
+east there is an old wooden door, with a large hole in it (about
+cyclops sized)."
+       "Strange Passage"
+       %<> #EXIT {"SOUTH" "CYCLO" "EAST" "LROOM"} () TIME 10}
+
+<ADD-OBJECT
+ #OBJECT {"CYCLO"
+         "" "cyclops" %<>
+         CYCLOPS () %<> %<+ ,VICBIT ,OVISON ,VILLAIN> 0 0 0 %,BIGFIX 10000}
+ ["ONE-E" "MONST"]>
+
+#ROOM {"TREAS"
+
+"This is a large room, whose north wall is solid granite.  A number
+of discarded bags, which crumble at your touch, are scattered about
+on the floor."
+       "Treasure Room"
+       %<> #EXIT {"DOWN" "CYCLO"} (#FIND-OBJ {"CHALI"}) TREASURE-ROOM 25}
+
+<ADD-OBJECT
+ #OBJECT {"CHALI"
+         "There is a silver chalice, intricately engraved, here."
+         "chalice" %<> CHALICE () %<> %<+ ,CONTBIT ,TAKEBIT ,OVISON> 0 10 10 10 5}
+ ["CUP" "GOBLE"]>
+
+#ROOM {"STUDI" 
+
+"You are in what appears to have been an artist's studio.  The walls
+and floors are splattered with paints of 69 different colors. 
+Strangely enough, nothing of value is hanging here.  At the north and
+northwest of the room are open doors (also covered with paint).  An
+extremely dark and narrow chimney leads up from a fireplace; although
+you might be able to get up it, it seems unlikely you could get back
+down."
+       "Studio"
+       %<> #EXIT {"NORTH" "CRAW4"
+                 "NW" "GALLE"
+                 "UP"
+                 #CEXIT {"LIGHT-LOAD"
+                         "KITCH"
+                         "The chimney is too narrow for you and all of your baggage."
+                         %<> CHIMNEY-FUNCTION}}
+       () %<>}
+
+#ROOM {"GALLE"
+"You are in an art gallery.  Most of the paintings which were here
+have been stolen by vandals with exceptional taste.  The vandals
+left through either the north or south exits."
+       "Gallery"
+       T #EXIT {"NORTH" "CHAS2" "SOUTH" "STUDI"} (#FIND-OBJ {"PAINT"})}
+
+
+<ADD-OBJECT
+ #OBJECT {"PAINT"
+         "A masterpiece by a neglected genius is here."
+         "painting"
+"Fortunately, there is still one chance for you to be a vandal, for on
+the far wall is a work of unparalleled beauty."
+         PAINTING () %<> %<+ ,BURNBIT ,TAKEBIT ,OVISON> 0 4 7 15 0}
+["ART" "CANVA" "MASTE"]>
+
+"LISTS OF CRUFT:  WEAPONS, AND IMMOVABLE OBJECTS"
+
+<ADD-DEMON <SETG ROBBER-DEMON
+                <CHTYPE [ROBBER () ,ROOMS <1 ,ROOMS> <FIND-OBJ "THIEF"> <>] HACK>>>
+
+<PSETG ROBBER-C-DESC
+"There is a suspicious-looking individual, holding a bag, leaning
+against one wall.  He is armed with a vicious-looking stilletto.">
+
+<PSETG ROBBER-U-DESC
+"There is a suspicious-looking individual lying unconscious on the
+ground.  His bag and stilletto seem to have vanished.">
+
+<ADD-OBJECT
+ #OBJECT {"THIEF"
+         %,ROBBER-C-DESC
+         "thief"
+         %<>
+         ROBBER-FUNCTION (#FIND-OBJ {"STILL"}) %<> %<+ ,VICBIT ,OVISON ,VILLAIN> 0 0 0 %,BIGFIX 4}[
+        "ROBBE" "CROOK" "CRIME" "CRIMI" "BANDI" "GENT" "GENTL"
+ "MAN" "SHADY" "THUG" "BAGMA" "MAFIA"]>
+
+<ADD-MELEE <FIND-OBJ "THIEF"> ,THIEF-MELEE>
+
+<ADD-OBJECT
+ #OBJECT {"STILL"
+         "There is a vicious-looking stilletto here."
+         "stilletto"
+         %<> %<> () %<FIND-OBJ "THIEF"> %<+ ,OVISON ,WEAPONBIT> 0 0 0 10 0}
+ [] ["VICIO"]>
+
+<SETG WEAPONS (<FIND-OBJ "STICK"> <FIND-OBJ "KNIFE">)>
+
+<SETG RANDOM-LIST
+      (<FIND-ROOM "LROOM">
+       <FIND-ROOM "KITCH">
+       <FIND-ROOM "CLEAR">
+       <FIND-ROOM "FORE3">
+       <FIND-ROOM "FORE2">
+       <FIND-ROOM "SHOUS">
+       <FIND-ROOM "FORE2">
+       <FIND-ROOM "KITCH">
+       <FIND-ROOM "EHOUS">)>
+
+<ADD-DESC <FIND-OBJ "BOOK">
+"              COMMANDMENT #12592
+Oh ye who go about saying unto each:   \"Hello sailor\":
+dost thou know the magnitude of thy sin before the gods?
+Yea, verily, thou shalt be ground between two stones.
+Shall the angry gods cast thy body into the whirlpool?
+Surely, thy eye shall be put out with a sharp stick!
+Even unto the ends of the earth shalt thou wander and
+unto the land of the dead shalt thou be sent at last.
+Surely thou shalt repent of thy cunning.">
+
+<ADD-DESC <FIND-OBJ "GUIDE">
+"\"               Guide Book to
+               Flood Control Dam #3
+
+  Flood Control Dam #3 (FCD#3) was constructed in year 783 of the
+Great Underground Empire to harness the destructive power of the
+Frigid River.  This work was supported by a grant of 37 million
+zorkmids from the Central Bureaucracy and your omnipotent local
+tyrant Lord Dimwit Flathead the Excessive. This impressive
+structure is composed of 3.7 cubic feet of concrete, is 256 feet
+tall at the center, and 193 feet wide at the top.  The reservoir
+created behind the dam has a volume of 37 billion cubic feet, an
+area of 12 million square feet, and a shore line of 36 thousand
+feet.
+
+  The construction of FCD#3 took 112 days from ground breaking to
+the dedication. It required a work force of 384 slaves, 34 slave
+drivers, 12 engineers, 2 turtle doves, and a partridge in a pear
+tree. The work was managed by a command team composed of 2345
+bureaucrats, 2347 secretaries (at least two of which can type),
+12,256 paper shufflers, 52,469 rubber stampers, 245,193 red tape
+processors, and nearly one million dead trees.
+
+  We will now point out some of the more interesting features
+of FCD#3 as we conduct you on a guided tour of the facilities:
+       1) You start your tour here in the Dam Lobby.
+          You will notice on your right that .........">
+
+<ADD-DESC <FIND-OBJ "PAPER">
+"              US NEWS & DUNGEON REPORT
+12/12/77                                      Late Dungeon Edition
+
+     In order to get a more-or-less working version, we have
+installed one with some known bugs.  In particular, the following
+sequence will not work correctly, nor will anything resembling it:
+>take
+take what?
+>frob
+what do you want me to do with it?
+     Note that if you now respond 'take', the right thing will
+happen. In short, the current parser can't handle verbs with missing
+objects.  Since it is completely new, we'd appreciate reports of any
+other bugs encountered.
+
+FLASH!
+     An important change has been made.  When you have been killed,
+and the 'patch' question is asked, or if you are confirming a 'quit',
+it is now necessary to terminate the response to the question with a
+carriage return (you may be surprised to find that this wasn't true
+before).  Also, the answer to the 'patch' question is taken to be yes
+unless something starting with n, N, f, or F is typed; the answer to
+the 'quit' question is no unless something starting with y, Y, t, or
+T is typed.
+
+FLASH!
+     Another FLAG DAY has been declared for save files.  Yes, ladies
+and gentlemen, yet another incompatible change has been made to the
+save/restore code.  When will it end?
+
+     Things like the bucket should resume working in this version.
+
+     Many people have reported the following message:
+'GIN FREE STORAGE- VECTOR ...GOUT TIME= n.nn'
+This indicates that a garbage collection is occurring.  Some reports
+have this taking up to 30 sec. of cpu time, during which your dungeon
+will refuse to respond.  We have added a feature which should prevent
+this; if you see such a message, please send mail to DUNGEON@DM
+describing the circumstances (particularly number of moves,
+save/restore status, and the TIME).  A garbage collection is not
+fatal:  your dungeon should be perfectly all right once it finishes
+(after the GOUT TIME= message is printed).
+">
+
+<ADD-DESC <FIND-OBJ "ADVER">
+"                      WELCOME TO DUNGEON
+
+    DUNGEON is a game of adventure, danger, and low cunning.  In it
+you will explore some of the most amazing territory ever seen by
+mortal man. Hardened adventurers have run screaming from the terrors
+contained within!
+
+    In DUNGEON the intrepid explorer delves into the forgotten
+secrets of a lost labyrinth deep in the bowels of the earth,
+searching for vast treasures long hidden from prying eyes, treasures
+guarded by fearsome monsters and diabolical traps!
+
+    No PDP-10 should be without one!
+
+    DUNGEON was created at the Programming Technology Division of the
+MIT Laboratory for Computer Science, by Tim Anderson, Marc Blank,
+Bruce Daniels, and Dave Lebling.  It was inspired by the ADVENTURE
+game of Crowther and Woods, and Dungeons and Dragons, by Gygax and
+Arneson.  DUNGEON is written in MDL (alias MUDDLE).
+
+    Direct inquiries by Net mail to DUNGEON@MIT-DMS.
+">
+
+<ADD-DESC <FIND-OBJ "MATCH">
+"      [close cover before striking BKD]
+
+You too can make BIG MONEY in the exciting field of
+               PAPER SHUFFLING!
+Mr. TAA of Muddle, Mass. says: \"Before I took
+this course I used to be a lowly bit twiddler.
+Now with what I learned at MIT Tech I feel really
+important and can obfuscate and confuse with the best.\"
+Mr. MARC had this to say: \"Ten short days ago all I could
+look forward to was a dead-end job as a doctor.  Now
+I have a promising future and make really big Zorkmids.\"
+
+MIT Tech can't promise these fantastic results to everyone.
+But when you earn your MDL degree from MIT Tech your future
+will be brighter. Send for our free brochure today.">
+
+<ADD-DESC <FIND-OBJ "ENGRA">
+"The engravings were incised in the living rock of the cave wall by
+an unknown hand.  They depict, in symbolic form, the beliefs of the
+ancient peoples of Zork.  Skillfully interwoven with the bas reliefs
+are excerpts illustrating the major tenets expounded by the sacred
+texts of the religion of that time.  Unfortunately a later age seems
+to have considered them blasphemous and just as skillfully excised
+them.">
+
+<ADD-DESC <FIND-OBJ "PRAYE">
+"The prayer is inscribed in an ancient script which is hardly
+remembered these days, much less understood.  What little of it can
+be made out seems to be a phillipic against small insects,
+absent-mindedness, and the picking up and dropping of small objects. 
+The final verse seems to consign trespassers to the land of the
+dead.  All evidence indicates that the beliefs of the ancient
+Zorkers were obscure.">
+
+; "ASSORTED DOORS"
+
+<PSETG BUTSTR "button">
+<PSETG DOORSTR "door">
+
+<ADD-OBJECT
+   <AOBJECT "WIND1" "window" WINDOW-FUNCTION ,OVISON ,DOORBIT ,NDESCBIT>
+   ["WINDO"] []>
+
+<ADD-OBJECT
+   <AOBJECT "WIND2" "window" WINDOW-FUNCTION ,OVISON ,DOORBIT ,NDESCBIT>
+   ["WINDO"] []>
+
+<ADD-OBJECT <AOBJECT "BOLT" "bolt" BOLT-FUNCTION ,TURNBIT ,OVISON ,DOORBIT ,NDESCBIT>
+           ["BOLT" "NUT"] []>
+
+<ADD-OBJECT
+  <AOBJECT "GRAT1" "grating" GRAT1-FUNCTION ,DOORBIT ,NDESCBIT>
+  ["GRATI" "GRATE"] []>
+
+<ADD-OBJECT
+  <AOBJECT "GRAT2" "grating" GRAT2-FUNCTION ,OVISON ,DOORBIT ,NDESCBIT>
+  ["GRATI" "GRATE"] []>
+
+<ADD-OBJECT <AOBJECT "DOOR" ,DOORSTR TRAP-DOOR ,DOORBIT ,NDESCBIT>
+           ["TRAPD" "TRAP-"] ["TRAP"]>
+
+<ADD-OBJECT <AOBJECT "TDOOR" ,DOORSTR TRAP-DOOR ,DOORBIT ,NDESCBIT>
+           ["TRAPD" "TRAP-"] ["TRAP"]>
+
+<ADD-OBJECT <AOBJECT "WDOOR" ,DOORSTR DDOOR-FUNCTION ,OVISON ,NDESCBIT ,READBIT>
+           ["DOOR"] ["WOODE"]>
+
+<ADD-DESC <FIND-OBJ "WDOOR">
+"The engravings translate to 'This space intentionally left blank'">
+
+<ADD-OBJECT <AOBJECT "FDOOR" ,DOORSTR DDOOR-FUNCTION ,OVISON ,NDESCBIT>
+           ["DOOR"] ["FRONT"]>
+
+<ADD-OBJECT <AOBJECT "SDOOR" ,DOORSTR DDOOR-FUNCTION ,OVISON ,NDESCBIT>
+           ["DOOR"] ["STONE"]>
+
+<ADD-OBJECT <AOBJECT "MSWIT" "switch" MSWITCH-FUNCTION ,OVISON ,NDESCBIT ,TURNBIT>
+           ["SWITC"]>
+
+; "ASSORTED GARBAGE"
+
+<ADD-OBJECT <SOBJECT "HPOLE" "head on a pole" ,OVISON> ["HEAD"]>
+<ADD-OBJECT <SOBJECT "CORPS" "corpses" ,OVISON> [] ["MANGL"]>
+<ADD-OBJECT <AOBJECT "BODIE" "pile of bodies" BODY-FUNCTION
+                    ,OVISON ,NDESCBIT ,TRYTAKEBIT>
+           ["BODY" "CORPS"]>
+
+<ADD-OBJECT <SOBJECT "DAM" "dam" ,OVISON ,NDESCBIT> ["GATE" "GATES" "FCD"]>
+<ADD-OBJECT <SOBJECT "RAILI" "railing" ,OVISON ,NDESCBIT> ["RAIL"]>
+<ADD-OBJECT <SOBJECT "BUTTO" "button" ,OVISON ,NDESCBIT> ["SWITC"]>
+<SOBJECT "BUBBL" "bubble" ,OVISON ,NDESCBIT>
+<ADD-OBJECT <AOBJECT "LEAK" "leak" LEAK-FUNCTION ,OVISON ,NDESCBIT> ["DRIP" "HOLE"]>
+<ADD-STAR <ADD-OBJECT
+          <AOBJECT "EVERY" "everything"
+                  EVERYTHING ,OVISON ,TAKEBIT ,NO-CHECK-BIT ,NDESCBIT>
+          ["ALL"]>>
+<ADD-STAR <ADD-OBJECT
+          <AOBJECT "VALUA" "valuables"
+                   VALUABLES ,OVISON ,TAKEBIT ,NO-CHECK-BIT ,NDESCBIT>
+          ["TREAS"]>>
+<ADD-STAR <SOBJECT "SAILO" "sailor" ,OVISON ,NDESCBIT>>
+<ADD-STAR <SOBJECT "TEETH" "set of teeth" ,OVISON ,NDESCBIT>>
+<ADD-STAR <SOBJECT "WALL" "wall" ,OVISON ,NDESCBIT>>
+<ADD-STAR <FIND-OBJ "GRUE">>
+<ADD-STAR <ADD-OBJECT <SOBJECT "HANDS" "pair of hands" ,OVISON ,NDESCBIT ,TOOLBIT>
+                     ["HAND"] ["BARE"]>>
+<ADD-STAR <ADD-OBJECT <SOBJECT "LUNGS" "breath" ,OVISON ,NDESCBIT ,TOOLBIT>
+                     ["LUNG" "AIR"]>>
+<ADD-STAR <SOBJECT "AVIAT" "flyer" ,OVISON ,NDESCBIT>>
+
+<ADD-OBJECT <SOBJECT "RBUTT" ,BUTSTR ,OVISON ,NDESCBIT>
+           ["BUTTO" "SWITC"]
+           ["RED"]>
+<ADD-OBJECT <SOBJECT "YBUTT" ,BUTSTR ,OVISON ,NDESCBIT>
+           ["BUTTO" "SWITC"]
+           ["YELLO"]>
+
+<ADD-OBJECT <SOBJECT "BLBUT" ,BUTSTR ,OVISON ,NDESCBIT>
+           ["BUTTO" "SWITC"]
+           ["BLUE"]>
+
+<ADD-OBJECT <SOBJECT "BRBUT" ,BUTSTR ,OVISON ,NDESCBIT>
+           ["BUTTO" "SWITC"]
+           ["BROWN"]>
+
+<ADD-OBJECT <AOBJECT "BAT" "bat" FLY-ME ,OVISON ,NDESCBIT ,TRYTAKEBIT> ["VAMPI"][]>
+\f
+"MORE VOCABULARY"
+
+<SOBJECT "RAINB" "rainbow" ,OVISON ,NDESCBIT>
+
+<PSETG CLIFFS #NEXIT "The White Cliffs prevent your landing here.">
+<PSETG RIVERDESC "Frigid River">
+
+#ROOM {"DOCK"
+"You are at the base of Flood Control Dam #3, which looms above you
+and to the north.  The river Frigid is flowing by here.  Across the
+river are the White Cliffs which seem to form a giant wall stretching
+from north to south along the east shore of the river as it winds its
+way downstream."
+       "Dam Base"
+       T
+       #EXIT {"NORTH" "DAM" "UP" "DAM" "LAUNC" "RIVR1"}
+       (#FIND-OBJ {"IBOAT"} #FIND-OBJ {"STICK"})
+       %<>}
+
+#ROOM {"RIVR1"
+"You are on the River Frigid in the vicinity of the Dam.  The river
+flows quietly here.  There is a landing on the west shore."
+       %,RIVERDESC
+       %<>
+       #EXIT {"UP" %,CURRENT "WEST" "DOCK" "LAND" "DOCK" "DOWN" "RIVR2"
+             "EAST" %,CLIFFS}
+       () %<> 0 %,RWATERBIT}
+
+#ROOM {"RIVR2"
+"The River turns a corner here making it impossible to see the
+Dam.  The White Cliffs loom on the east bank and large rocks prevent
+landing on the west."
+       %,RIVERDESC
+       %<>
+       #EXIT {"UP" %,CURRENT "DOWN" "RIVR3" "EAST" %,CLIFFS} () %<> 0
+       %,RWATERBIT}
+
+#ROOM {"RIVR3"
+"The river descends here into a valley.  There is a narrow beach on
+the east below the cliffs and there is some shore on the west which
+may be suitable.  In the distance a faint rumbling can be heard."
+       %,RIVERDESC
+       %<>
+       #EXIT {"UP" %,CURRENT "DOWN" "RIVR4" "EAST" "WCLF1" "WEST" "RCAVE"
+             "LAND" #NEXIT "You must specify which direction here."}
+       () %<> 0 %,RWATERBIT}
+
+<PSETG NARROW "The path is too narrow.">
+
+#ROOM {"WCLF1"
+"You are on a narrow strip of beach which runs along the base of the
+White Cliffs. The only path here is a narrow one, heading south
+along the Cliffs."
+       "White Cliffs Beach"
+       %<>
+       #EXIT {"SOUTH" #CEXIT {"DEFLATE" "WCLF2" %,NARROW} "LAUNC" "RIVR3"}
+       () CLIFF-FUNCTION 0}
+
+#ROOM {"WCLF2"
+
+"You are on a rocky, narrow strip of beach beside the Cliffs.  A
+narrow path leads north along the shore."
+       "White Cliffs Beach"
+       %<>
+       #EXIT {"NORTH" #CEXIT {"DEFLATE" "WCLF1" %,NARROW} "LAUNC" "RIVR4"}
+       () CLIFF-FUNCTION 0}
+
+#ROOM {"RIVR4"
+
+"The river is running faster here and the sound ahead appears to be
+that of rushing water.  On the west shore is a sandy beach.  A small
+area of beach can also be seen below the Cliffs."
+       %,RIVERDESC
+       %<>
+       #EXIT {"UP" %,CURRENT "DOWN" "RIVR5" "EAST" "WCLF2" "WEST" "BEACH"
+             "LAND" #NEXIT "Specify the direction to land."}
+       (#FIND-OBJ {"BUOY"})
+       RIVR4-ROOM 0 %,RWATERBIT}
+
+#ROOM {"RIVR5"
+"The sound of rushing water is nearly unbearable here.  On the west
+shore is a large landing area."
+       %,RIVERDESC
+       %<>
+       #EXIT {"UP" %,CURRENT "DOWN" "FCHMP" "LAND" "FANTE"} () %<> 0
+       %,RWATERBIT}
+
+#ROOM {"FCHMP"
+       ""
+       "Moby lossage" %<> #EXIT {"NORTH" #NEXIT ""} () OVER-FALLS}
+
+#ROOM {"FANTE"
+"You are on the shore of the River.  The river here seems somewhat
+treacherous.  A path travels from north to south here, the south end
+quickly turning around a sharp corner."
+       "Shore"
+       %<>
+       #EXIT {"LAUNC" "RIVR5" "NORTH" "BEACH"
+             "SOUTH" "FALLS"}
+       () %<> 0}
+
+#ROOM {"BEACH"
+"You are on a large sandy beach at the shore of the river, which is
+flowing quickly by.  A path runs beside the river to the south here."
+       "Sandy Beach"
+       %<>
+       #EXIT {"LAUNC" "RIVR4" "SOUTH" "FANTE"}
+       (#FIND-OBJ {"STATU"})
+       BEACH-ROOM 0}
+
+#ROOM {"RCAVE"
+"You are on the west shore of the river.  An entrance to a cave is
+to the northwest.  The shore is very rocky here."
+       "Rocky Shore"
+       %<>
+       #EXIT {"LAUNC" "RIVR3" "NW" "TCAVE"} () %<>
+       0}
+
+#ROOM {"TCAVE"
+"You are in a small cave whose exits are on the south and northwest."
+       "Small Cave"
+       %<>
+       #EXIT {"SOUTH" "RCAVE" "NW" "CHAS3"}
+       (#FIND-OBJ {"GUANO"} #FIND-OBJ {"SHOVE"})
+       TCAVE-ROOM}
+
+#ROOM {"BARRE"
+"You are in a barrel.  Congratulations.  Etched into the side of the
+barrel is the word 'Geronimo!'."
+       "Barrel"
+       %<>
+       #EXIT {"EXIT" "FALLS"}}
+
+#ROOM {"FALLS"
+       ""
+       "Aragain Falls"
+       %<>
+       #EXIT {"EAST" #CEXIT {"RAINBOW" "RAINB"} "DOWN" "FCHMP" "NORTH" "FANTE"
+             "ENTER" "BARRE" "UP" #CEXIT {"RAINBOW" "RAINB"}}
+       (#FIND-OBJ {"RAINB"} #FIND-OBJ {"BARRE"}) FALLS-ROOM}
+
+#ROOM {"RAINB"
+"You are on top of a rainbow (I bet you never thought you would walk
+on a rainbow), with a magnificent view of the Falls.  The rainbow
+travels east-west here.  There is an NBC Commissary here."
+       "Rainbow Room"
+       T
+       #EXIT {"EAST" "POG" "WEST" "FALLS"}}
+
+<SETG CRAIN #CEXIT {"RAINBOW" "RAINB"}>
+
+#ROOM {"POG"
+"You are on a small beach on the continuation of the Frigid River
+past the Falls.  The beach is narrow due to the presence of the White
+Cliffs.  The river canyon opens here and sunlight shines in from
+above. A rainbow crosses over the falls to the west and a narrow path
+continues to the southeast."
+       "End of Rainbow"
+       T
+       #EXIT {"UP" %,CRAIN "NW" %,CRAIN "WEST" %,CRAIN "SE" "CLBOT"}
+       (#FIND-OBJ {"RAINB"} #FIND-OBJ {"POT"}) %<> 0}
+
+#ROOM {"CLBOT"
+"You are beneath the walls of the river canyon which may be climbable
+here.  There is a small stream here, which is the lesser part of the
+runoff of Aragain Falls. To the north is a narrow path."
+       "Canyon Bottom"
+       T
+       #EXIT {"UP" "CLMID" "CLIMB" "CLMID" "NORTH" "POG"}}
+
+#ROOM {"CLMID"
+
+"You are on a ledge about halfway up the wall of the river canyon.
+You can see from here that the main flow from Aragain Falls twists
+along a passage which it is impossible to enter.  Below you is the
+canyon bottom.  Above you is more cliff, which still appears
+climbable."
+       "Rocky Ledge"
+       T
+       #EXIT {"UP" "CLTOP" "CLIMB" "CLTOP" "DOWN" "CLBOT"}}
+
+#ROOM {"CLTOP"
+
+"You are at the top of the Great Canyon on its south wall.  From here
+there is a marvelous view of the Canyon and parts of the Frigid River
+upstream.  Across the canyon, the walls of the White Cliffs still
+appear to loom far above.  Following the Canyon upstream (north and
+northwest), Aragain Falls may be seen, complete with rainbow. 
+Fortunately, my vision is better than average and I can discern the
+top of the Flood Control Dam #3 far to the distant north.  To the
+west and south can be seen an immense forest, stretching for miles
+around.  It is possible to climb down into the canyon from here."
+       "Canyon View"
+       T
+       #EXIT {"DOWN" "CLMID" "CLIMB" "CLMID" "SOUTH" "FORE4" "WEST" "FORE5"}}
+
+<ADD-OBJECT
+ #OBJECT {"POT"
+         "There is a pot of gold here."
+         "pot filled with gold"
+         "At the end of the rainbow is a pot of gold."
+         %<> () %<> %,TAKEBIT 0 10 10 15 0}
+[] ["GOLD"]>
+
+<ADD-OBJECT
+ #OBJECT {"STATU"
+         "There is a beautiful statue here."
+         "statue"
+         %<> %<> () %<> %,TAKEBIT 0 10 13 8 0}[
+ "SCULP" "ROCK"]>
+
+<ADD-OBJECT
+ #OBJECT {"IBOAT"
+
+"There is a folded pile of plastic here which has a small valve
+attached." "plastic inflatable boat" %<> IBOAT-FUNCTION ()
+         %<> %<+ ,BURNBIT ,OVISON ,TAKEBIT> 0 0 0 20 0}[
+ "BOAT" "PLAST" "PILE"]>
+
+<ADD-OBJECT
+ #OBJECT {"DBOAT"
+         "There is a pile of plastic here with a large hole in it."
+         "plastic boat (with hole)"
+         %<> DBOAT-FUNCTION () %<> %<+ ,BURNBIT ,OVISON ,TAKEBIT> 0 0 0 20 0}[
+ "BOAT" "PLAST" "PILE"]>
+
+<ADD-OBJECT 
+ #OBJECT {"PUMP"
+         "There is a small pump here."
+         "hand-held air pump"
+         %<> %<> () %<> %<+ ,TOOLBIT ,OVISON ,TAKEBIT> 0 0 0 5 0}[
+ "AIR-P" "AIRPU"]>
+
+<ADD-OBJECT
+ #OBJECT {"RBOAT"
+         "There is an inflated boat here."
+         "magic boat"
+         %<>
+         RBOAT-FUNCTION (#FIND-OBJ {"LABEL"}) %<> 
+         %<+ ,VEHBIT ,BURNBIT ,OVISON ,TAKEBIT>
+         0 0 0 20 100}
+["BOAT"] ["PLAST" "SEAWO"]>
+
+<PUT <FIND-OBJ "RBOAT"> ,OOPEN? T>
+<PUT <FIND-OBJ "RBOAT"> ,ORAND ,RWATERBIT>
+
+<ADD-OBJECT
+ #OBJECT {"LABEL"
+         "There is a tan label here."
+         "tan label"
+         %<> %<> () #FIND-OBJ {"RBOAT"} %<+ ,BURNBIT ,OVISON ,READBIT ,TAKEBIT>
+         0 0 0 2 0}
+["FINEP"] ["TAN"]>
+
+<ADD-DESC <FIND-OBJ "LABEL">
+"        !!!!  FROBOZZ MAGIC BOAT COMPANY  !!!!
+
+Hello, Sailor!
+
+Instructions for use:
+   
+   To get into boat, say 'Board'
+   To leave boat, say 'Disembark'
+
+   To get into a body of water, say 'Launch'
+   To get to shore, say 'Land'
+    
+Warranty:
+
+  This boat is guaranteed against all defects in parts and
+workmanship for a period of 76 milliseconds from date of purchase or
+until first used, whichever comes first.
+
+Warning:
+   This boat is made of plastic.               Good Luck!
+">
+
+<ADD-OBJECT
+ #OBJECT {"STICK"
+         "There is a broken sharp stick here."
+         "broken sharp stick"
+         "A sharp stick, which appears to have been broken at one end, is here."
+         STICK-FUNCTION () %<> %<+ ,OVISON ,TAKEBIT> 0 0 0 3 0}
+[] ["SHARP" "BROKE"]>
+
+<SOBJECT "BARRE" "barrel" ,OVISON>
+
+<ADD-OBJECT
+ #OBJECT {"BUOY"
+         "There is a red buoy here (probably a warning)."
+         "red buoy"
+         %<> %<> (#FIND-OBJ {"EMERA"}) %<> %<+ ,CONTBIT ,FINDMEBIT ,OVISON ,TAKEBIT>
+         0 0 0 10 20}
+[]["RED"]>
+
+<ADD-OBJECT
+ #OBJECT {"EMERA"
+         "There is an emerald here."
+         "large emerald"
+         %<> %<> () #FIND-OBJ {"BUOY"} %<+ ,OVISON ,TAKEBIT> 0 5 10 5 0}[]>
+
+<ADD-OBJECT
+ #OBJECT {"SHOVE"
+         "There is a large shovel here."
+         "shovel"
+         %<> %<> () %<> %<+ ,TOOLBIT ,OVISON ,TAKEBIT> 0 0 0 15 0}[]>
+
+<ADD-OBJECT
+ #OBJECT {"GUANO"
+         "There is a hunk of bat guano here."
+         "hunk of bat guano"
+         %<> %<> () %<> %<+ ,OVISON ,TAKEBIT> 0 0 0 20 0}[
+ "CRAP" "SHIT" "HUNK"]>
+
+<ADD-OBJECT
+ #OBJECT {"GRUE"
+         "" "lurking grue" %<> GRUE-FUNCTION () %<> %,OVISON 0 0 0 0 0}
+ [] ["LURKI"]>
+
+#ROOM {"VLBOT"
+"You are at the bottom of a large dormant volcano.  High above you
+light may be seen entering from the cone of the volcano.  The only
+exit here is to the north."
+       "Volcano Bottom"
+       %<>
+       #EXIT {"NORTH" "LAVA"}
+       (#FIND-OBJ {"BALLO"})}
+
+<PSETG VOLCORE "Volcano Core">
+
+<SETG NULEXIT #EXIT {"#!#!#" "!"}>
+
+#ROOM {"VAIR1"
+"You are about one hundred feet above the bottom of the volcano.  The
+top of the volcano is clearly visible here."
+       %,VOLCORE %<> %,NULEXIT () %<> 0 %,RAIRBIT}
+
+#ROOM {"VAIR2"
+"You are about two hundred feet above the volcano floor.  Looming
+above is the rim of the volcano.  There is a small ledge on the west
+side."
+       %,VOLCORE
+       %<>
+       #EXIT {"WEST" "LEDG2" "LAND" "LEDG2"}
+       () %<> 0 %,RAIRBIT}
+
+#ROOM {"VAIR3"
+"You are high above the floor of the volcano.  From here the rim of
+the volcano looks very narrow and you are very near it.  To the 
+east is what appears to be a viewing ledge, too thin to land on."
+       %,VOLCORE %<> %,NULEXIT () %<> 0 %,RAIRBIT}
+
+#ROOM {"VAIR4"
+"You are near the rim of the volcano which is only about 15 feet
+across.  To the west, there is a place to land on a wide ledge."
+       %,VOLCORE
+       %<>
+       #EXIT {"LAND" "LEDG4" "EAST" "LEDG4"}
+       () %<> 0 %,RAIRBIT}
+
+<SETG CXGNOME #CEXIT {"GNOME-DOOR" "VLBOT"}>
+
+#ROOM {"LEDG2"
+"You are on a narrow ledge overlooking the inside of an old dormant
+volcano.  This ledge appears to be about in the middle between the
+floor below and the rim above. There is an exit here to the south."
+       "Narrow Ledge"
+       %<>
+       #EXIT {"DOWN" #NEXIT "I wouldn't jump from here."
+             "LAUNC" "VAIR2" "WEST" %,CXGNOME "SOUTH" "LIBRA"}
+       (#FIND-OBJ {"HOOK1"} #FIND-OBJ {"ZORKM"})}
+
+#ROOM {"LIBRA"
+"You are in a room which must have been a large library, probably
+for the royal family.  All of the shelves appear to have been gnawed
+to pieces by unfriendly gnomes.  To the north is an exit."
+       "Library"
+       %<>
+       #EXIT {"NORTH" "LEDG2" "OUT" "LEDG2"}
+       (#FIND-OBJ {"BLBK"} #FIND-OBJ {"GRBK"} #FIND-OBJ {"PUBK"}
+       #FIND-OBJ {"WHBK"})}
+
+#ROOM {"LEDG3"
+"You are on a ledge in the middle of a large volcano.  Below you
+the volcano bottom can be seen and above is the rim of the volcano.
+A couple of ledges can be seen on the other side of the volcano;
+it appears that this ledge is intermediate in elevation between
+those on the other side.  The exit from this room is to the east."
+       "Volcano View"
+       %<>
+       #EXIT {"DOWN" #NEXIT "I wouldn't try that."
+             "CROSS" #NEXIT "It is impossible to cross this distance."
+             "EAST" "EGYPT"}}
+
+#ROOM {"LEDG4"
+       ""
+       "Wide Ledge"
+       %<>
+       #EXIT {"DOWN" #NEXIT "It's a long way down."
+             "LAUNC" "VAIR4" "WEST" %,CXGNOME "SOUTH" "SAFE"}
+       (#FIND-OBJ {"HOOK2"})
+       LEDGE-FUNCTION}
+
+#ROOM {"SAFE"
+       ""
+       "Dusty Room"
+       T
+       #EXIT {"NORTH" "LEDG4"}
+       (#FIND-OBJ {"SSLOT"} #FIND-OBJ {"SAFE"})
+       SAFE-ROOM}
+
+#ROOM {"LAVA"
+"You are in a small room, whose walls are formed by an old lava flow.
+There are exits here to the west and the south."
+       "Lava Room"
+       %<>
+       #EXIT {"SOUTH" "VLBOT" "WEST" "RUBYR"}}
+
+<ADD-OBJECT
+ #OBJECT {"BALLO"
+"There is a very large and extremely heavy wicker basket with a cloth
+bag here. Inside the basket is a metal receptacle of some kind. 
+Attached to the basket on the outside is a piece of wire."
+         "basket"
+         %<>
+         BALLOON (#FIND-OBJ {"CBAG"} #FIND-OBJ {"BROPE"} #FIND-OBJ {"RECEP"})
+         %<> %<+ ,VEHBIT ,OVISON> 0 0 0 70 100}
+ ["BASKE"] ["WICKE"]>
+
+<PUT <FIND-OBJ "BALLO"> ,OOPEN? T>
+<PUT <FIND-OBJ "BALLO"> ,ORAND ,RAIRBIT>
+
+ #OBJECT {"RECEP"
+         ""
+         "receptacle"
+         %<> %<> () #FIND-OBJ {"BALLO"} %<+ ,CONTBIT ,OVISON ,SEARCHBIT> 0 0 0 %,BIGFIX 6}
+
+<ADD-OBJECT
+ #OBJECT {"CBAG"
+         ""
+         "cloth bag"
+         %<> %<> () #FIND-OBJ {"BALLO"} %,OVISON 0 0 0 %,BIGFIX 0}
+ ["BAG"] ["CLOTH"]>
+
+<ADD-OBJECT
+ #OBJECT {"BROPE"
+         "" "braided wire" %<> WIRE-FUNCTION ()
+         #FIND-OBJ {"BALLO"} %<+ ,TIEBIT ,OVISON> 0 0 0 %,BIGFIX 0}
+ ["WIRE"] ["BRAID"]>
+
+ <ADD-OBJECT
+ #OBJECT {"HOOK1"
+         "There is a small hook attached to the rock here."
+         "hook"
+         %<> %<> () %<> %,OVISON 0 0 0 %,BIGFIX 0}
+ ["HOOK"]>
+
+<ADD-OBJECT
+ #OBJECT {"HOOK2"
+         "There is a small hook attached to the rock here."
+         "hook"
+         %<> %<> () %<> %,OVISON 0 0 0 %,BIGFIX 0}
+ ["HOOK"]>
+
+<ADD-OBJECT
+ #OBJECT {"ZORKM"
+         "There is an engraved zorkmid coin here."
+         "priceless zorkmid"
+         "On the floor is a gold zorkmid coin (a valuable collector's item)."
+         %<> () %<> %<+ ,READBIT ,OVISON ,TAKEBIT> 0 10 12 10 0}
+ ["COIN"] ["GOLD"]>
+
+<ADD-DESC <FIND-OBJ "ZORKM">
+         "
+              --------------------------
+             /      Gold Zorkmid        \\
+            /  T e n   T h o u s a n d   \\
+           /        Z O R K M I D S       \\
+          /                                \\
+         /        ||||||||||||||||||        \\
+        /        !||||          ||||!        \\
+       |          |||   ^^  ^^   |||          |
+       |          |||   OO  OO   |||          |
+       | In Frobs  |||    <<    |||  We Trust |
+       |            || (______) ||            |
+       |             |          |             |
+       |             |__________|             |
+        \\                                   /
+         \\    -- Lord Dimwit Flathead --    /
+          \\    -- Beloved of Zorkers --    /
+           \\                             /
+            \\      * 722 G.U.E. *       /
+             \\                                 /
+              --------------------------
+">
+
+
+<ADD-OBJECT 
+ #OBJECT {"SAFE"
+         ""
+         "box"
+         %<> SAFE-FUNCTION (#FIND-OBJ {"CROWN"} #FIND-OBJ {"CARD"}) %<> %<+ ,CONTBIT ,OVISON>
+         0 0 0 %,BIGFIX 15}
+ ["BOX"]>
+
+<ADD-OBJECT
+ #OBJECT {"CARD"
+         "There is a card with writing on it here."
+         "card"
+         %<> %<> () #FIND-OBJ {"SAFE"}
+         %<+ ,OVISON ,TAKEBIT ,READBIT ,BURNBIT> 0 0 0 1 0}
+ ["NOTE"]>
+
+<ADD-DESC <FIND-OBJ "CARD">
+         "
+Warning:
+    This room was constructed over very weak rock strata.  Detonation
+of explosives in this room is strictly prohibited!
+                       Frobozz Magic Cave Company
+                       per M. Agrippa, foreman
+">
+
+<ADD-OBJECT
+ #OBJECT {"SSLOT"
+         ""
+         "hole"
+         %<> %<> () %<> %,OVISON 0 0 0 %,BIGFIX 10}
+ ["SLOT" "HOLE"]>
+
+<PUT <FIND-OBJ "SSLOT"> ,OOPEN? T>
+
+<ADD-OBJECT
+ #OBJECT {"CROWN"
+         "Lord Dimwit's crown is here."
+         "crown"
+         "The excessively gaudy crown of Lord Dimwit Flathead is here."
+         %<> () #FIND-OBJ {"SAFE"} %<+ ,OVISON ,TAKEBIT> 0 15 10 10 0}
+ [] ["GAUDY"]>
+
+<ADD-OBJECT 
+ #OBJECT {"BRICK"
+         "There is a square brick here which feels like clay."
+         "brick"
+         %<> %<> () %<> %<+ ,BURNBIT ,SEARCHBIT ,OVISON ,TAKEBIT> 0 0 0 9 2}
+ ["BRICK"] ["SQUAR" "CLAY"]>
+
+<PUT <FIND-OBJ "BRICK"> ,OOPEN? T>
+
+<ADD-OBJECT
+ #OBJECT {"FUSE"
+         "There is a coil of thin shiny wire here."
+         "wire coil"
+         %<> FUSE-FUNCTION () %<> %<+ ,BURNBIT ,OVISON ,TAKEBIT> 0 0 0 1 0}
+ ["COIL" "WIRE"] ["SHINY" "THIN"]>
+
+
+<ADD-OBJECT
+ #OBJECT {"GNOME"
+         "There is a nervous Volcano Gnome here."
+         "Volcano Gnome"
+         %<> GNOME-FUNCTION () %<> %<+ ,VICBIT ,OVISON> 0 0 0 %,BIGFIX 0}
+ ["TROLL"]>
+
+<ADD-OBJECT
+ #OBJECT {"BLABE"
+         "There is a blue label here."
+         "blue label" %<> %<> () #FIND-OBJ {"BALLO"}
+         %<+ ,OVISON ,TAKEBIT ,READBIT ,BURNBIT> 0 0 0 1 0}
+ ["LABEL"] ["BLUE"]>
+
+<ADD-DESC <FIND-OBJ "BLABE">
+         "
+         !!!!  FROBOZZ MAGIC BALLOON COMPANY !!!!
+
+Hello, Aviator!
+
+Instructions for use:
+   
+   To get into balloon, say 'Board'
+   To leave balloon, say 'Disembark'
+   To land, say 'Land'
+    
+Warranty:
+   
+   No warranty is expressed or implied.  You're on your own, sport!
+
+                                       Good Luck.
+">
+
+<ADD-OBJECT 
+ #OBJECT {"DBALL"
+         "There is a balloon here, broken into pieces."
+         "broken balloon"
+         %<> %<> () %<> %<+ ,TAKEBIT ,OVISON> 0 0 0 40 0}
+ ["BALLO" "BASKE"] ["BROKE"]>
+
+<ADD-OBJECT
+ #OBJECT {"BLBK"
+         "There is a blue book here."
+         "blue book"
+         %<> %<> () %<> %<+ ,CONTBIT ,TAKEBIT ,OVISON ,READBIT> 0 0 0 10 2}
+ ["BOOK"] ["BLUE"]>
+
+<ADD-OBJECT
+ #OBJECT {"GRBK"
+         "There is a green book here."
+         "green book"
+         %<> %<> () %<> %<+ ,CONTBIT ,TAKEBIT ,OVISON ,READBIT> 0 0 0 10 2}
+ ["BOOK"] ["GREEN"]>
+
+<ADD-OBJECT
+ #OBJECT {"PUBK"
+         "There is a purple book here."
+         "purple book"
+         %<> %<> (#FIND-OBJ {"STAMP"}) %<> %<+ ,TAKEBIT ,OVISON ,READBIT ,CONTBIT>
+         0 0 0 10 2}
+ ["BOOK"] ["PURPL"]>
+
+<ADD-OBJECT
+ #OBJECT {"WHBK"
+         "There is a white book here."
+         "white book"
+         %<> %<> () %<> %<+ ,CONTBIT ,TAKEBIT ,OVISON ,READBIT> 0 0 0 10 2}
+ ["BOOK"] ["WHITE"]>
+
+<PSETG GREEK-TO-ME 
+"This book is written in a tongue with which I am unfamiliar.">
+
+<ADD-DESC <FIND-OBJ "BLBK"> ,GREEK-TO-ME>
+<ADD-DESC <FIND-OBJ "GRBK"> ,GREEK-TO-ME>
+<ADD-DESC <FIND-OBJ "PUBK"> ,GREEK-TO-ME>
+<ADD-DESC <FIND-OBJ "WHBK"> ,GREEK-TO-ME>
+
+ #OBJECT {"STAMP"      
+         "There is a Flathead Commemorative stamp here."
+         "stamp"
+         %<> %<> () #FIND-OBJ {"PUBK"} %<+ ,TAKEBIT ,READBIT ,BURNBIT ,OVISON>
+         0 4 10 1 0}
+
+<ADD-DESC <FIND-OBJ "STAMP">
+         "
+---v----v----v----v----v----v----v----v---
+|                                       |
+|         ||||||||||        LORD        |
+>         !||||             |      DIMWIT       <
+|        ||||    ---|     FLATHEAD      |
+|        |||C     CC \\                 |
+>         ||||       _\\                <
+|          ||| (____|                   |
+|           ||      |                   |
+>            |______|       Our         <
+|              /   \\    Excessive      |
+|             /     \\     Leader       |
+>            |       |                  <
+|            |       |                  |
+|                                       |
+>    G.U.E. POSTAGE       3 Zorkmids    <
+|                                       |
+---^----^----^----^----^----^----^----^---
+">
+
+<SETG BLOC <FIND-ROOM "VLBOT">>
+
+; "SET UP LIGHT INTERRUPTS, ETC."
+
+<PUT <FIND-OBJ "LAMP"> ,ORAND [0 <CLOCK-DISABLE <CLOCK-INT ,LNTIN 350>>]>
+
+<PUT <FIND-OBJ "CANDL"> ,ORAND <>>
+
+<PUT <FIND-OBJ "MATCH"> ,ORAND 5>              ; "NUMBER OF MATCHES"
+
+<PSETG INDENTSTR <REST <ISTRING 8 !\ > 8>>
+
+#ROOM {"TOMB"
+"You are in the Tomb of the Unknown Implementer.
+A hollow voice says:  \"That's not a bug, it's a feature!\""
+       "Tomb of the Unknown Implementer"
+       %<> #EXIT {"WEST" "LLD2"} (#FIND-OBJ {"TOMB"}
+                                   #FIND-OBJ {"HEADS"}
+                                   #FIND-OBJ {"COKES"}
+                                   #FIND-OBJ {"LISTS"})
+       %<> 0}
+
+<ADD-OBJECT
+ #OBJECT {"TOMB"
+"There is a tomb here, made of the finest marble, and large enough
+for four headless corpses.  On one end is the cryptic inscription:
+                   
+                     \"Feel Free.\"
+"
+         "tomb" %<>
+         HEAD-FUNCTION () %<> %<+ ,TRYTAKEBIT ,READBIT ,OVISON>}
+ ["GRAVE"]>
+
+<ADD-DESC <FIND-OBJ "TOMB">
+"Here lie the implementers, whose heads were placed on poles by the
+Keeper of the Dungeon for amazing untastefulness.">
+
+<ADD-OBJECT
+ #OBJECT {"HEADS"
+         "There are four heads here, mounted securely on poles."
+         "set of poled heads" %<>
+         HEAD-FUNCTION
+         () %<> %<+ ,TRYTAKEBIT ,SACREDBIT ,OVISON>}
+ ["HEAD" "POLE" "POLES" "PDL" "BKD" "TAA" "MARC" "IMPLE" "LOSER"]>
+
+<ADD-OBJECT
+ #OBJECT {"COKES"
+"Many empty Coke bottles are here.  Alas, they can't hold water."
+         "bunch of Coke bottles"
+"There is a large pile of empty Coke bottles here, evidently produced
+by the implementers during their long struggle to win totally."
+         COKE-BOTTLES
+         () %<> %<+ ,OVISON ,TAKEBIT> 0 0 0 15}
+ ["BOTTL"] ["COKE"]>
+
+<ADD-OBJECT
+ #OBJECT {"LISTS"
+"There is an enormous stack of line-printer paper here.  It is barely
+readable."
+         "stack of listings"
+"There is a gigantic pile of line-printer output here.  Although the
+paper once contained useful information, almost nothing can be
+distinguished now."
+         %<> () %<> %<+ ,READBIT ,BURNBIT ,OVISON ,TAKEBIT> 0 0 0 70}
+ ["PAPER" "LIST" "PRINT" "LISTI" "STACK"]>
+
+<ADD-DESC <FIND-OBJ "LISTS">
+         "<DEFINE FEEL-FREE (LOSER)
+                  <TELL \"FEEL FREE, CHOMPER!\">>
+                       ...
+The rest is, alas, unintelligible (as were the implementers).">
+
+<ADD-OBJECT
+ #OBJECT {"LCASE"
+"There is a large case here, containing objects which you used to
+possess."
+"large case" %<> %<> () %<> %<+ ,OVISON ,TRANSBIT>}
+ ["CASE"] ["LARGE"]>
+
+<MAPF <>
+   <FUNCTION (X) <RTRO <FIND-ROOM <SPNAME .X>> ,RFILLBIT>>
+ ![RESEN!-ROOMS RESES!-ROOMS DAM!-ROOMS STREA!-ROOMS
+   RIVR1!-ROOMS RIVR2!-ROOMS RIVR3!-ROOMS RIVR4!-ROOMS RIVR5!-ROOMS
+   BEACH!-ROOMS RCAVE!-ROOMS DOCK!-ROOMS WCLF1 WCLF2 FANTE POG]>
+
+<MAPF <>
+  <FUNCTION (X) <RTRO <FIND-ROOM .X> ,RHOUSEBIT>>
+  ["LROOM" "KITCH" "ATTIC"]>
+
+<MAPF <>
+   <FUNCTION (X) <RTRO <FIND-ROOM .X> ,RSACREDBIT>>
+      ["BSHAF"
+       "RIVR1"
+       "DOCK"
+       "FANTE"
+       "FALLS"
+       "BEACH"
+       "RCAVE"
+       "VAIR1"
+       "VAIR2"
+       "VAIR3"
+       "VAIR4"
+       "RIVR2"
+       "RIVR3"
+       "RIVR4"
+       "RIVR5"
+       "TIMBE"
+       "WHOUS"
+       "NHOUS"
+       "EHOUS"
+       "SHOUS"
+       "KITCH"
+       "LROOM"
+       "FORE1"
+       "FORE2"
+       "FORE3"
+       "FORE4"
+       "FORE5"
+       "CLEAR"
+       "TEMP1"
+       "TEMP2"
+       "CLTOP"
+       "CLMID"
+       "CLBOT"
+       "RAINB"
+       "FALLS"]>
+
+<SETG BUCKET-TOP!-FLAG <>>
+
+<SETG MAGCMACH #CEXIT {"FROBOZZ" "CMACH" ""}>
+<SETG MAGALICE #CEXIT {"FROBOZZ" "ALICE" ""}>
+
+#ROOM {"MAGNE"
+       ""
+       "Low Room"
+       %<>
+       #EXIT {"NORTH" %,MAGCMACH "SOUTH" %,MAGCMACH "WEST" %,MAGCMACH "NE" %,MAGCMACH
+             "NW" %,MAGALICE "SW" %,MAGALICE "SE" %,MAGALICE "EAST" %,MAGCMACH}
+       (#FIND-OBJ {"RBTLB"} #FIND-OBJ {"ROBOT"}) MAGNET-ROOM}
+
+#ROOM {"CMACH"
+       ""
+       "Machine Room"
+       %<>
+       #EXIT {"WEST" "MAGNE" "SOUTH" "CAGER"}
+       (#FIND-OBJ {"SQBUT"} #FIND-OBJ {"RNBUT"} #FIND-OBJ {"TRBUT"})
+       CMACH-ROOM}
+
+#ROOM {"CAGER"
+"You are in a dingy closet adjacent to the machine room.  On one wall
+is a small sticker which says
+               Protected by
+                 FROBOZZ
+            Magic Alarm Company
+             (Hello, footpad!)
+"
+       "Dingy Closet"
+       %<>
+       #EXIT {"NORTH" "CMACH"}
+       (#FIND-OBJ {"SPHER"})}
+
+#ROOM {"CAGED"
+"You are trapped inside an iron cage."
+       "Cage"
+       %<>
+       #EXIT {"NORTH" #NEXIT ""}
+       (#FIND-OBJ {"CAGE"}) CAGED-ROOM}
+
+<ADD-OBJECT
+ #OBJECT {"CAGE"
+         "There is a mangled cage here."
+         "mangled cage"
+         %<> %<> () %<> %<+ ,OVISON ,NDESCBIT> 0 0 0 60 0}
+ [] []>
+
+<ADD-OBJECT 
+ #OBJECT {"RCAGE"
+         "There is an iron cage in the middle of the room."
+         "iron cage"
+         %<> %<> () %<> %,OVISON 0 0 0 0 0}
+ ["CAGE"] ["IRON"]>
+
+<ADD-OBJECT 
+ #OBJECT {"SPHER"
+         "There is a beautiful crystal sphere here."
+         "crystal sphere"
+         %<> SPHERE-FUNCTION () %<> %<+ ,TRYTAKEBIT ,SACREDBIT ,OVISON> 0 6 6 10 0}
+ ["BALL"] ["CRYST" "GLASS"]>
+
+<ADD-OBJECT <AOBJECT "SQBUT" ,BUTSTR BUTTONS ,OVISON ,NDESCBIT> ["BUTTO"] ["SQUAR"]>
+<ADD-OBJECT <AOBJECT "RNBUT" ,BUTSTR BUTTONS ,OVISON ,NDESCBIT> ["BUTTO"] ["ROUND"]>
+<ADD-OBJECT <AOBJECT "TRBUT" ,BUTSTR BUTTONS ,OVISON ,NDESCBIT> ["BUTTO"] ["TRIAN"]>
+
+#ROOM {"TWELL"
+
+"You are at the top of the well.  Well done.  There are etchings on
+the side of the well. There is a small crack across the floor at the
+entrance to a room on the east, but it can be crossed easily."
+       "Top of Well"
+       %<>
+       #EXIT {"EAST" "ALICE" "DOWN" #NEXIT "It's a long way down!"}
+       (#FIND-OBJ {"ETCH2"}) %<> 10 %<+ ,RLANDBIT ,RBUCKBIT>}
+
+#ROOM {"BWELL"
+       
+"You are in a damp circular room, whose walls are made of brick and
+mortar.  The roof of this room is not visible, but there appear to be
+some etchings on the walls.  There is a passageway to the west."
+       "Circular Room"
+       %<>
+       #EXIT {"WEST" "MPEAR" "UP" #NEXIT "The walls cannot be climbed."}
+       (#FIND-OBJ {"BUCKE"} #FIND-OBJ {"ETCH1"}) %<> 0 %<+ ,RLANDBIT ,RBUCKBIT>}
+
+<PSETG EWALLS ["ETCHI" "WALLS" "WALL"]>
+<ADD-OBJECT <SOBJECT "ETCH1" "wall with etchings" ,OVISON ,NDESCBIT ,READBIT> ,EWALLS>
+<ADD-OBJECT <SOBJECT "ETCH2" "wall with etchings" ,OVISON ,NDESCBIT ,READBIT> ,EWALLS>
+
+<ADD-DESC <FIND-OBJ "ETCH2">
+"                      o  b  o
+                   r             z
+                f   M  A  G  I  C   z
+                c    W  E   L  L    y
+                   o             n
+                       m  p  a
+">
+
+<ADD-DESC <FIND-OBJ "ETCH1">
+"                      o  b  o
+                                 
+                       A  G  I  
+                        E   L  
+                                 
+                       m  p  a
+">
+
+#ROOM {"ALICE"
+
+"You are in a small square room, in the center of which is a large
+oblong table, no doubt set for afternoon tea.  It is clear from the
+objects on the table that the users were indeed mad.  In the eastern
+corner of the room is a small hole (no more that four inches high). 
+There are passageways leading away to the west and the northwest."
+       "Tea Room"
+       %<>
+       #EXIT {"EAST" #NEXIT "Only a mouse could get in there."
+             "WEST" "TWELL" "NW" "MAGNE"}
+       (#FIND-OBJ {"ATABL"} #FIND-OBJ {"ECAKE"} #FIND-OBJ {"ORICE"}
+       #FIND-OBJ {"RDICE"} #FIND-OBJ {"BLICE"})}
+
+<PSETG SMDROP #NEXIT "There is a chasm too large to jump across.">
+
+#ROOM {"ALISM"
+
+"You are in an enormous room, in the center of which are four wooden
+posts delineating a rectanular area, above which is what appears to
+be a wooden roof.  In fact, all objects in this room appear to be
+abnormally large. To the east is a passageway.  There is a large
+chasm on the west and the northwest."
+       "Posts Room"
+       %<>
+       #EXIT {"NW" %,SMDROP "EAST" "ALITR" "WEST" %,SMDROP "DOWN" %,SMDROP}
+       (#FIND-OBJ {"POSTS"})}
+
+#ROOM {"ALITR"
+
+"You are in a large room, one half of which is depressed.  There is a
+large leak in the ceiling through which brown colored goop is
+falling.  The only exit to this room is to the west."
+       "Pool Room"
+       %<>
+       #EXIT {"EXIT" "ALISM" "WEST" "ALISM"}
+       (#FIND-OBJ {"FLASK"} #FIND-OBJ {"POOL"} #FIND-OBJ {"SAFFR"})}
+
+<ADD-OBJECT
+ #OBJECT {"FLASK"
+"A stoppered glass flask with a skull-and-crossbones marking is here.
+The flask is filled with some clear liquid."
+         "glass flask filled with liquid"
+         %<> FLASK-FUNCTION () %<> %<+ ,TRANSBIT ,OVISON ,TAKEBIT> 0 0 0 10 5}
+ [] ["GLASS"]>
+
+<ADD-OBJECT
+ #OBJECT {"POOL"
+         "The leak has submerged the depressed area in a pool of sewage."
+         "pool of sewage"
+         %<> %<> () %<> %<+ ,OVISON ,VICBIT> 0 0 0 0 0}
+ ["SEWAG"] ["LARGE"]>
+
+<ADD-OBJECT 
+ #OBJECT {"SAFFR"
+         "There is a tin of rare spices here."
+         "tin of spices"
+         %<> %<> () %<> %,TAKEBIT 0 5 5 8 0}
+ ["TIN" "SPICE"] ["RARE"]>
+
+<ADD-OBJECT <SOBJECT "ATABL" "large oblong table" ,OVISON> [] ["LARGE" "OBLON"]>
+
+<ADD-OBJECT <SOBJECT "POSTS" "wooden posts" ,OVISON> ["POST"] ["WOODE"]>
+
+<ADD-OBJECT
+ #OBJECT {"BUCKE"
+"There is a wooden bucket here, 3 feet in diameter and 3 feet high."
+         "wooden bucket"
+         %<> BUCKET () %<> %<+ ,VEHBIT ,OVISON> 0 0 0 100 100}
+ [] ["WOODE"]>
+
+<ADD-OBJECT
+ #OBJECT {"ECAKE"
+ "There is a piece of cake here with the words 'Eat Me' on it."
+         "piece of 'Eat Me' cake"
+         %<> EATME-FUNCTION () %<> %<+ ,OVISON ,TAKEBIT ,FOODBIT> 0 0 0 10 0}
+ ["CAKE"] ["EATME" "EAT-M"]>
+
+<ADD-OBJECT
+ #OBJECT {"ORICE"
+ "There is a piece of cake with orange icing here."
+         "piece of cake with orange icing"
+         %<> CAKE-FUNCTION () %<> %<+ ,READBIT ,OVISON ,TAKEBIT ,FOODBIT> 0 0 0 4 0}
+ ["CAKE" "ICING"] ["ORANG"]>
+
+<ADD-OBJECT
+ #OBJECT {"RDICE"
+ "There is a piece of cake with red icing here."
+         "piece of cake with red icing"
+         %<> CAKE-FUNCTION () %<> %<+ ,READBIT ,OVISON ,TAKEBIT ,FOODBIT> 0 0 0 4 0}
+ ["CAKE" "ICING"] ["RED"]>
+
+<ADD-OBJECT
+ #OBJECT {"BLICE"
+ "There is a piece of cake with blue (ecch) icing here."
+         "piece of cake with blue icing"
+         %<> CAKE-FUNCTION () %<> %<+ ,READBIT ,OVISON ,TAKEBIT ,FOODBIT> 0 0 0 4 0}
+ ["CAKE" "ICING"] ["BLUE" "ECCH"]>
+
+<PUT <PUT <FIND-OBJ "BUCKE"> ,OOPEN? T> ,ORAND ,RBUCKBIT>
+
+<ADD-OBJECT
+ #OBJECT {"ROBOT"
+         "There is a robot here."
+         "robot"
+         %<> ROBOT-FUNCTION () %<> %<+ ,SACREDBIT ,VICBIT ,OVISON ,ACTORBIT> 0 0 0 0 0}
+ ["R2D2" "C3PO" "ROBBY"]>
+
+<PUT <FIND-OBJ "ROBOT">
+     ,ORAND
+     <ADD-ACTOR 
+       <CHTYPE [<FIND-ROOM "MAGNE"> () 0 <> <FIND-OBJ "ROBOT"> ROBOT-ACTOR 3 T 0] ADV>>>
+
+<ADD-OBJECT
+ #OBJECT {"RBTLB"
+         "There is a green piece of paper here."
+         "green piece of paper"
+         %<>  %<> () %<> %<+ ,OVISON ,TAKEBIT ,READBIT ,BURNBIT> 0 0 0 3 0}
+ ["PAPER"] ["GREEN"]>
+
+<ADD-DESC <FIND-OBJ "RBTLB">
+"        !!!!  FROBOZZ MAGIC ROBOT COMPANY  !!!!
+
+Hello, Master!
+   
+   I am a late-model robot, trained at MIT Tech to perform various
+simple household functions. 
+
+Instructions for use:
+   To activate me, use the following formula:
+       >TELL ROBOT '<something to do>' <cr>
+   The quotation marks are required!
+       
+Warranty:
+   No warranty is expressed or implied.
+                               
+                                       At your service!
+" >
+;"VERBS"
+
+<SADD-ACTION "BACK" BACKER>
+
+<SADD-ACTION "REPEN" REPENT>
+
+<SADD-ACTION "TIME" PLAY-TIME>
+
+<SADD-ACTION "WAIT" WAIT>
+
+<SADD-ACTION "CURSE" CURSES>
+<VSYNONYM "CURSE" "SHIT" "FUCK" "DAMN">
+
+<SADD-ACTION "JARGON" JARGON>
+<VSYNONYM "JARGON" "FOO" "BLETCH">
+
+<ADD-ACTION "PUT"
+           "Put"
+           [OBJ "IN" OBJ ["PUT" PUTTER] DRIVER]
+           ["DOWN" OBJ ["DROP" DROPPER]]> 
+       
+<ADD-ACTION "PICK"
+           "Pick"
+           ["UP" OBJ ["TAKE" TAKE]]>
+
+<VSYNONYM "PUT" "STUFF" "PLACE" "INSER">
+
+<1ADD-ACTION "LOWER" "Lower" R/L>
+
+<ADD-ACTION "RAISE"
+           "Raise"
+           [OBJ ["RAISE" R/L] DRIVER]
+           ["UP" OBJ ["RAISE" R/L]]>
+
+<VSYNONYM "RAISE" "LIFT">
+
+<1ADD-ACTION "MELT" "Melt" MELTER>
+<VSYNONYM "MELT" "LIQUI">
+
+<ADD-ACTION "LIGHT"
+           "Light"
+           [(,LIGHTBIT AOBJS ROBJS NO-TAKE) ["LIGHT" LAMP-ON] DRIVER]
+           [(,LIGHTBIT AOBJS ROBJS NO-TAKE) "WITH" (,FLAMEBIT AOBJS)
+                                            ["LIGHT" LAMP-ON]]>
+
+<ADD-ACTION "EXTIN"
+           "Turn off"
+           [(,LIGHTBIT AOBJS ROBJS) ["EXTIN" LAMP-OFF]]>
+<VSYNONYM "EXTIN" "DOUSE">
+
+<ADD-ACTION "TURN"
+           "Turn"
+           [(,TURNBIT AOBJS ROBJS NO-TAKE)
+            "WITH"
+            (,TOOLBIT ROBJS AOBJS)
+            ["TURN" TURNER]
+            DRIVER]
+           ["ON" (,LIGHTBIT AOBJS ROBJS) ["TURN-ON" LAMP-ON]]
+           ["OFF" (,LIGHTBIT AOBJS ROBJS) ["TURN-OFF" LAMP-OFF]]
+           [(,TURNBIT AOBJS ROBJS NO-TAKE)
+            "TO"
+            (-1 ROBJS)
+            ["TURN-TO" TIME]]>
+
+<ADD-ACTION "TAKE" "Take" [(-1 ROBJS AOBJS NO-TAKE) ["TAKE" TAKE]]>
+<VSYNONYM "TAKE" "GET" "HOLD" "CARRY">
+
+<ADD-ACTION "LOOK"
+           "Look"
+           [["LOOK" ROOM-DESC]]
+           ["AT" OBJ ["LOOK-AT" ROOM-DESC]]
+           ["UNDER" OBJ ["LOOK-UNDER" LOOK-UNDER]]>
+
+<ADD-ACTION "GIVE"
+           "Give"
+           [OBJ "TO" (,VICBIT ROBJS NO-TAKE) ["GIVE" DROPPER] DRIVER]
+           [(,VICBIT ROBJS NO-TAKE) OBJ ["GIVE" DROPPER] FLIP]>
+<VSYNONYM "GIVE" "HAND" "DONAT">
+
+<ADD-ACTION "STRIK"
+           "Strike"
+           [(,VICBIT = ROBJS NO-TAKE)
+            "WITH"
+            (,WEAPONBIT AOBJS ROBJS)
+            ["ATTAC" ATTACKER]]
+           [(,VICBIT = ROBJS NO-TAKE) ["ATTAC" ATTACKER] DRIVER]
+           [(-1 ROBJS AOBJS) ["LIGHT" LAMP-ON]]>
+
+<AADD-ACTION "MOVE" "Move" MOVE>
+<VSYNONYM "MOVE" "PULL" "TUG">
+
+<AADD-ACTION "WAVE" "Wave" WAVER>
+<VSYNONYM "BRAND" "FLAUN">
+
+<ADD-ACTION "DROP"
+           "Drop"
+           [(-1 AOBJS) ["DROP" DROPPER] DRIVER]
+           [(-1 AOBJS) "IN" OBJ ["DROP" DROPPER]]>
+<VSYNONYM "DROP" "RELEA">
+
+<ADD-ACTION "POUR"
+           "Pour"
+           [(-1 AOBJS) ["POUR" DROPPER] DRIVER]
+           [(-1 AOBJS) "IN" OBJ ["POUR" DROPPER]]>
+<VSYNONYM "POUR" "SPILL">
+
+<ADD-ACTION "THROW"
+           "Throw"
+           [(-1 AOBJS) "AT" (,VICBIT ROBJS NO-TAKE) ["THROW" DROPPER]]>
+<VSYNONYM "THROW" "HURL" "CHUCK">
+
+<ADD-ACTION "TELL"
+           "Tell"
+           [(,ACTORBIT) ["TELL" COMMAND]]>
+<VSYNONYM "TELL" "COMMA" "REQUE">
+
+<VSYNONYM "LOOK" "L" "STARE" "GAZE">
+
+<SADD-ACTION "BRIEF" BRIEF>
+
+<SADD-ACTION "UNBRI" UN-BRIEF>
+
+<SADD-ACTION "SUPER" SUPER-BRIEF>
+
+<SADD-ACTION "UNSUP" UN-SUPER-BRIEF>
+
+<1ADD-ACTION "EXAMI" "Examine" ROOM-INFO>
+<VSYNONYM "EXAMI" "DESCR" "WHAT" "WHATS" "WHAT'">
+
+<1ADD-ACTION "FIND" "Find" FIND>
+<VSYNONYM "WHERE" "FIND" "SEEK" "SEE">
+
+<SADD-ACTION "INVEN" INVENT>
+<VSYNONYM "INVEN" "LIST">
+
+<SADD-ACTION "VERSI" VERSION>
+
+<SADD-ACTION "SCRIP" DO-SCRIPT>
+
+<SADD-ACTION "UNSCR" DO-UNSCRIPT>
+
+<SADD-ACTION "SAVE" DO-SAVE>
+
+<SADD-ACTION "RESTO" DO-RESTORE>
+
+<SADD-ACTION "WALK-IN" TIME>
+
+<SADD-ACTION "C-INT" TIME>     ;"funny verb for clock ints"
+
+<SADD-ACTION "DEAD!" TIME>     ;"funny verb for killing villains"
+
+<SADD-ACTION "FIRST?" TIME>    ;"funny verb for surprise by villains"
+
+<SADD-ACTION "DIAGN" DIAGNOSE>
+
+<SADD-ACTION "HACK?" TIME>     ;"funny verb for villain fight decisions"
+
+<SADD-ACTION "SCORE" SCORE>
+
+<SADD-ACTION "QUIT" FINISH>
+
+<SADD-ACTION "INFO" INFO>
+
+<SADD-ACTION "HELP" HELP>
+
+<ADD-ACTION "PLUG"
+           "Plug"
+           [OBJ "WITH" OBJ ["PLUG" PLUGGER]]>
+<VSYNONYM "PLUG" "GLUE" "PATCH">
+
+<1ADD-ACTION "RUB" "Rub" RUBBER>
+<VSYNONYM "RUB" "CARES" "TOUCH" "FONDL">
+
+<SADD-ACTION "SWIM" SWIMMER>
+<VSYNONYM "SWIM" "BATHE" "WADE">
+
+<ADD-ACTION "BURN"
+           "Burn"
+           [(,BURNBIT AOBJS ROBJS NO-TAKE) "WITH" (,FLAMEBIT AOBJS ROBJS)
+                       ["BURN" BURNER]]>
+<VSYNONYM "BURN" "INCIN" "IGNIT">
+
+<ADD-ACTION "KILL"
+           "Kill"
+           [(,VILLAIN ROBJS NO-TAKE) "WITH" (,WEAPONBIT AOBJS) ["KILL" KILLER]]>
+<VSYNONYM "KILL"
+        "MURDE"
+        "SLAY"
+        "DISPA">
+
+<ADD-ACTION "ATTAC"
+           "Attack"
+           [(,VILLAIN ROBJS NO-TAKE) "WITH" (,WEAPONBIT AOBJS) ["ATTAC" ATTACKER]]>
+<VSYNONYM "ATTAC"
+        "FIGHT"
+        "MUNG"
+        "HACK"
+        "FROB"
+        "HURT"
+        "INJUR"
+        "DAMAG"
+        "HIT">
+
+<ADD-ACTION "SWING"
+           "Swing"
+           [(,WEAPONBIT AOBJS) "AT" (,VILLAIN ROBJS NO-TAKE) ["SWING" SWINGER]]>
+<VSYNONYM "SWING"
+        "THRUS">
+
+<ADD-ACTION "POKE"
+           "Poke"
+           [(,VILLAIN ROBJS NO-TAKE) "WITH" (,WEAPONBIT AOBJS) ["POKE" MUNGER]]>
+<VSYNONYM "POKE"
+        "JAB"
+        "BREAK">
+
+<1ADD-ACTION "KICK" "Kick" KICKER>
+<VSYNONYM "KICK"
+        "BITE"
+        "TAUNT">
+
+<1ADD-ACTION "PUSH" "Push" PUSHER>
+<VSYNONYM "PUSH" "PRESS">
+
+<ADD-ACTION "OPEN"
+           "Open"
+           [(<+ ,DOORBIT ,CONTBIT> AOBJS ROBJS NO-TAKE) ["OPEN" OPENER]]>
+<VSYNONYM "OPEN">
+
+<ADD-ACTION "CLOSE"
+           "Close"
+           [(<+ ,DOORBIT ,CONTBIT> AOBJS ROBJS NO-TAKE) ["CLOSE" CLOSER]]>
+<VSYNONYM "CLOSE">
+
+<ADD-ACTION "UNLOC"
+           "Unlock"
+           [(-1 ROBJS NO-TAKE) "WITH" (,TOOLBIT AOBJS ROBJS) ["UNLOC" UNLOCKER]]>
+
+<ADD-ACTION "LOCK"
+           "Lock"
+           [(-1 ROBJS NO-TAKE) ["LOCK" LOCKER]]>
+
+<ADD-ACTION "TIE"
+           "Tie"
+           [OBJ "TO" OBJ ["TIE" TIE]]>
+<VSYNONYM "TIE" "KNOT" "FASTE">
+
+<1ADD-ACTION "RING" "Ring" RING>
+<VSYNONYM "RING" "PEAL">
+
+<ADD-ACTION "EAT"
+           "Eat"
+           [(,FOODBIT AOBJS ROBJS) ["EAT" EAT]]>
+<VSYNONYM "EAT" "CONSU" "GOBBL" "MUNCH" "TASTE">
+
+<ADD-ACTION "DRINK"
+           "Drink"
+           [(,DRINKBIT AOBJS ROBJS) ["DRINK" EAT]]>
+<VSYNONYM "DRINK" "IMBIB" "SWALL">
+
+<ADD-ACTION "BRUSH"
+           "Brush"
+           [(-1 AOBJS ROBJS) ["BRUSH" BRUSH] DRIVER]
+           [(-1 AOBJS ROBJS) "WITH" OBJ ["BRUSH" BRUSH]]>
+<VSYNONYM "BRUSH" "CLEAN">
+
+<1ADD-ACTION "UNTIE" "Untie" UNTIE>
+<VSYNONYM "UNTIE" "RELEA" "FREE">
+
+<SADD-ACTION "EXORC" EXORCISE>
+<VSYNONYM "EXORC" "XORCI">
+
+<SADD-ACTION "CHOMP" CHOMP>
+<VSYNONYM "CHOMP" "LOSE" "BARF">
+
+<SADD-ACTION "YELL" YELL>
+<VSYNONYM "YELL" "SCREA" "SHOUT">
+
+<SADD-ACTION "WIN" WIN>
+<VSYNONYM "WIN" "WINNA">
+
+<SADD-ACTION "FROBO" FROBOZZ>
+
+<SADD-ACTION "TREAS" TREAS>
+
+<SADD-ACTION "TEMPL" TREAS>
+
+<SADD-ACTION "PRAY" PRAYER>
+
+<SADD-ACTION "JUMP" LEAPER>
+
+<SADD-ACTION "SKIP" SKIPPER>
+<VSYNONYM "SKIP" "HOP">
+
+<SADD-ACTION "MUMBL" MUMBLER>
+<VSYNONYM "MUMBL" "SIGH">
+
+<SADD-ACTION "ZORK" ZORK>
+
+<SADD-ACTION "DUNGE" DUNGEON>
+
+<ADD-ACTION "WAKE"
+           "Wake"
+           [(,VICBIT ROBJS NO-TAKE) ["WAKE" ALARM]]>
+<VSYNONYM "WAKE" "AWAKE" "SURPR" "START">
+
+<ADD-ACTION "HELLO"
+           "Hello"
+           [["HELLO" HELLO] DRIVER]
+           [OBJ ["HELLO" HELLO]]>
+<VSYNONYM "HELLO" "HI">
+
+<1ADD-ACTION "GRANI" "Granite" GRANITE>
+
+<VSYNONYM "JUMP" "LEAP" "VAULT">
+
+<1ADD-ACTION "FILL" "Fill" FILL>
+
+<SADD-ACTION "WELL" WELL>
+
+<SADD-ACTION "ODYSS" SINBAD>
+<VSYNONYM "ODYSS" "ULYSS">
+
+<ADD-ACTION "READ"
+           "Read"
+           [(,READBIT AOBJS ROBJS NO-TAKE) ["READ" READER] DRIVER]
+           [(,READBIT AOBJS ROBJS NO-TAKE) "WITH" OBJ ["READ" READER]]>
+<VSYNONYM "READ" "SKIM" "SCAN">
+
+<1ADD-ACTION "DEFLA" "Deflate" DEFLATER>
+
+<ADD-ACTION "INFLA"
+           "Inflate"
+           [OBJ "WITH" (,TOOLBIT ROBJS AOBJS NO-TAKE) ["INFLA" INFLATER]]>
+
+<ADD-ACTION "DISEM"
+           "Disembark from"
+           [(,VEHBIT ROBJS NO-TAKE) ["DISEM" UNBOARD]]>
+
+<ADD-ACTION "DIG"
+           "Dig"
+           ["WITH" (,TOOLBIT AOBJS) ["DIG" DIGGER]]>
+
+<ADD-ACTION "BOARD"
+           "Board"
+           [(,VEHBIT ROBJS NO-TAKE) ["BOARD" BOARD]]>
+
+<ADD-ACTION "KNOCK"
+           "Knock"
+           ["AT" OBJ ["KNOCK" KNOCK] DRIVER]
+           ["ON" OBJ ["KNOCK" KNOCK]]
+           ["DOWN" (,VICBIT = ROBJS NO-TAKE) ["ATTAC" ATTACKER]]>
+
+<SADD-ACTION "GERON" GERONIMO>
+
+<SADD-ACTION "BLAST" BLAST>
+
+<1ADD-ACTION "WALK" "Walk" WALK>
+
+<ADD-BUZZ "RUN" "GO" "PROCE">
+
+<SETG ROBOT-ACTIONS ![,WALK!-WORDS ,TAKE!-WORDS ,DROP!-WORDS ,PUT!-WORDS
+    ,JUMP!-WORDS ,PUSH!-WORDS ,THROW!-WORDS ,TURN!-WORDS]>
+
+<SETG PLAYER 
+      <ADD-ACTOR <CHTYPE [,WHOUS!-ROOMS
+                         () 0 <> <FIND-OBJ "#####"> <> 0 T 0]
+                        ADV>>>
+\0\0
\ No newline at end of file
diff --git a/zork/lcf/act1.37 b/zork/lcf/act1.37
new file mode 100644 (file)
index 0000000..608113c
--- /dev/null
@@ -0,0 +1,2024 @@
+"VOCABULARY, ACTION FUNCTIONS, MAZE (NORMALLY ENCODED)"
+
+<DEFINE BLO (Y)
+       <COND (<TYPE? ,REP SUBR FSUBR>
+              <SET READ-TABLE <PUT <IVECTOR 256 0> <CHTYPE <ASCII !\<> FIX> !\\e>>
+              <EVALTYPE FORM SEGMENT>
+              <APPLYTYPE SUBR FIX>
+              <PUT <ALLTYPES> 6 <7 <ALLTYPES>>>
+              <SUBSTITUTE 2 1>
+              <OFF .BH>)>>
+
+<GDECL (FF) STRING>
+<DEFINE ILO (BODY TYPE NM1 NM2 "OPTIONAL" M1 M2)
+       #DECL ((BODY NM1 NM2 M1 M2) STRING (TYPE) FIX)
+       <COND (<==? .TYPE *400000000000*>
+              <COND (<OR <AND <MEMBER "<FLUSH-ME>" .BODY>
+                              <NOT <MEMBER ,XUNM ,WINNERS>>>
+                         <AND <MEMBER .NM1 ,WINNERS>
+                              <MEMBER ,FF .BODY>>>
+                     <EVAL <PARSE .BODY>>)>)>
+       <DISMISS T>>
+
+;"ROOM FUNCTIONS"
+
+<DEFINE EAST-HOUSE ("AUX" (WIN ,WINNER) (PRSVEC ,PRSVEC)
+                         (PRSACT <1 .PRSVEC>))
+    #DECL ((PRSVEC) VECTOR (WIN) ADV (PRSACT) VERB)
+    <COND (<==? .PRSACT ,LOOK!-WORDS>
+          <TELL 
+"You are behind the white house.  In one corner of the house there
+is a small window which is " 1 <COND (,KITCHEN-WINDOW!-FLAG
+                                     "open.")
+                                    ("slightly ajar.")>>)>>
+          
+; "HACK THE KITCHEN WINDOW"
+
+<SETG GRUNLOCK!-FLAG <>>
+
+<DEFINE WINDOW-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <OPEN-CLOSE .PRSACT
+               KITCHEN-WINDOW!-FLAG
+"With great effort, you open the window far enough to allow entry."
+"The window closes (more easily than it opened).">>
+
+<DEFINE OPEN-CLOSE (VERB ATM STROPN STRCLS)
+    #DECL ((VERB) VERB (ATM) ATOM (STROPN STRCLS) STRING)
+    <COND (<==? .VERB ,OPEN!-WORDS>
+          <COND (,.ATM
+                 <TELL <PICK-ONE ,DUMMY>>)
+                (<TELL .STROPN>
+                 <SETG .ATM T>)>)
+         (<==? .VERB ,CLOSE!-WORDS>
+          <COND (,.ATM
+                 <TELL .STRCLS>
+                 <SETG .ATM <>>
+                 T)
+                (<TELL <PICK-ONE ,DUMMY>>)>)>>
+
+; "KITCHEN -- CHECK THE WINDOW"
+
+<DEFINE KITCHEN ("AUX" (WIN ,WINNER) (PRSVEC ,PRSVEC)
+                         (PRSACT <1 .PRSVEC>))
+    #DECL ((PRSVEC) VECTOR (WIN) ADV (PRSACT) VERB)
+    <COND (<==? .PRSACT ,LOOK!-WORDS>
+          <TELL
+
+"You are in the kitchen of the white house.  A table seems to have
+been used recently for the preparation of food.  A passage leads to
+the west and a dark staircase can be seen leading upward.  To the
+east is a small window which is " 0>
+          <COND (,KITCHEN-WINDOW!-FLAG
+                 <TELL "open." 1>)
+                (<TELL "slightly ajar." 1>)>)
+         (T)>>
+
+<DEFINE LEAF-PILE ("AUX" (PV ,PRSVEC) (L <2 .PV>))
+       #DECL ((PV) <VECTOR [3 ANY]> (L) OBJECT)
+       <COND (<==? <1 .PV> ,BURN!-WORDS>
+              <PUT .L ,ORAND 1>
+              <COND (<OROOM .L>
+                     <TELL "The leaves burn and the neighbors start to complain.">
+                     <REMOVE-OBJECT .L>)
+                    (T
+                     <DROP-OBJECT .L>
+                     <JIGS-UP
+"The sight of someone carrying a pile of burning leaves so offends
+the neighbors that they come over and put you out.">)>)
+             (<==? <1 .PV> ,MOVE!-WORDS>
+              <PUT .L ,ORAND 1>
+              <TELL "Done.">)>>
+
+<PSETG RESDESC
+"However, with the water level lowered, there is merely a wide stream
+running through the center of the room.">
+
+<PSETG GLADESC
+"You are in a large room, with giant icicles hanging from the walls
+and ceiling.  There are passages to the north and east.">
+
+<DEFINE GLACIER-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (<==? .PRSACT ,LOOK!-WORDS>
+          <COND (,GLACIER-FLAG!-FLAG
+                 <TELL ,GLADESC>
+                 <TELL "There is a large passageway leading westward." 1>)
+                (<TELL ,GLADESC>)>)>>
+
+<DEFINE TROPHY-CASE ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL #DECL ((PRSACT) VERB)
+    <COND (<==? .PRSACT ,TAKE!-WORDS>
+          <TELL
+"The trophy case is securely fastened to the wall (perhaps to foil any
+attempt by robbers to remove it).">)>>
+         
+<DEFINE GLACIER ("AUX" (PRSVEC ,PRSVEC) (PRSACT <1 .PRSVEC>) T)
+    #DECL ((PRSVEC) <VECTOR VERB [2 ANY]> (PRSACT) VERB (T) OBJECT)
+    <COND (<==? <VNAME .PRSACT> THROW!-WORDS>
+          <COND (<==? <2 .PRSVEC> <SET T <FIND-OBJ "TORCH">>>
+                 <TELL 
+"The torch hits the glacier and explodes into a great ball of flame,
+devouring the glacier.  The water from the melting glacier rushes
+downstream, carrying the torch with it.  In the place of the glacier,
+there is a passageway leading west.">
+                 <REMOVE-OBJECT <FIND-OBJ "ICE">>
+                 <REMOVE-OBJECT .T>
+                 <INSERT-OBJECT .T <FIND-ROOM "STREA">>
+                 <PUT .T ,ODESC2 "burned out ivory torch">
+                 <PUT .T ,ODESC1 "There is a burned out ivory torch here.">
+                 <PUT .T ,OLIGHT? 0>
+                 <TRZ .T ,FLAMEBIT>
+                 <OR <LIT? ,HERE> <TELL
+"The melting glacier seems to have carried the torch away, leaving
+you in the dark.">>
+                 <SETG GLACIER-FLAG!-FLAG T>)
+                (<TELL
+"The glacier is unmoved by your ridiculous attempt.">
+                 <>)>)
+         (<==? <VNAME .PRSACT> MELT!-WORDS>
+          <TELL
+"How exactly are you going to melt this glacier?">)>>
+
+<PSETG YUKS
+      '["Nice try."
+       "You can't be serious."
+       "Chomp, Chomp."
+       "Not a prayer."
+       "I don't think so."]>
+
+<DEFINE RESERVOIR-SOUTH ("AUX" (PRSACT <1 ,PRSVEC>)) 
+       #DECL ((PRSACT) VERB)
+       <COND (<==? .PRSACT ,LOOK!-WORDS>
+              <COND (,LOW-TIDE!-FLAG
+                     <TELL 
+"You are in the south end of a large cavernous room which was formerly
+a reservoir."
+>
+                     <TELL ,RESDESC 1>)
+                    (<TELL "You are at the south end of a large reservoir.">)>
+              <TELL 
+"There is a western exit, a passageway south, and a steep pathway
+climbing up along the edge of a cliff." 1>)>>
+
+<DEFINE RESERVOIR-NORTH ("AUX" (PRSACT <1 ,PRSVEC>)) 
+       #DECL ((PRSACT) VERB)
+       <COND (<==? .PRSACT ,LOOK!-WORDS>
+              <COND (,LOW-TIDE!-FLAG
+                     <TELL 
+"You are in the north end of a large cavernous room which was formerly
+a reservoir."
+>
+                     <TELL ,RESDESC 1>)
+                    (<TELL "You are at the north end of a large reservoir.">)>
+              <TELL "There is a tunnel leaving the room to the north." 1>)>>
+
+;"LIVING-ROOM -- FUNCTION TO ENTER THE DUNGEON FROM THE HOUSE"
+
+<DEFINE LIVING-ROOM ("AUX" (WIN ,WINNER) (PRSVEC ,PRSVEC) RUG?
+                          (PRSACT <1 .PRSVEC>) TC)
+       #DECL ((PRSVEC) VECTOR (WIN) ADV (RUG?) <OR ATOM FALSE>
+              (PRSACT) VERB (TC) OBJECT)
+       <COND (<==? .PRSACT ,LOOK!-WORDS>
+              <COND (,MAGIC-FLAG!-FLAG
+                     <TELL 
+"You are in the living room.  There is a door to the east.  To the
+west is a cyclops-shaped hole in an old wooden door, above which is
+some strange gothic lettering " 0>)
+                    (<TELL 
+"You are in the living room.  There is a door to the east, a wooden
+door with strange gothic lettering to the west, which appears to be
+nailed shut, " 0>)>
+              <SET RUG? <ORAND <FIND-OBJ "RUG">>>
+              <COND (<AND .RUG? ,TRAP-DOOR!-FLAG>
+                     <TELL 
+"and a rug lying beside an open trap-door." 1>)
+                    (.RUG?
+                     <TELL 
+"and a closed trap-door at your feet." 1>)
+                    (,TRAP-DOOR!-FLAG
+                     <TELL "and an open trap-door at your feet." 1>)
+                    (<TELL 
+"and a large oriental rug in the center of the room." 1>)>
+              T)
+             (<AND <SET TC <FIND-OBJ "TCASE">>
+                   <OR <==? .PRSACT ,TAKE!-WORDS>
+                       <AND <==? .PRSACT ,PUT!-WORDS>
+                            <==? <3 .PRSVEC> .TC>>>>
+              <PUT ,WINNER ,ASCORE <+ ,RAW-SCORE
+                                      <MAPF ,+ ,OTVAL <OCONTENTS .TC>>>>)>>
+
+<DEFINE TRAP-DOOR ("AUX" (PRSACT <1 ,PRSVEC>) (RM ,HERE))
+    #DECL ((PRSACT) VERB (RM) ROOM)
+    <COND (<==? .RM <FIND-ROOM "LROOM">>
+          <COND (<==? .PRSACT ,OPEN!-WORDS>
+                 <COND (,TRAP-DOOR!-FLAG
+                        <TELL "It's open.">)
+                       (<TELL 
+"The door reluctantly opens to reveal a rickety staircase descending
+into darkness.">)>
+                 <COND-OPEN DOWN!-DIRECTIONS .RM>)
+                (<==? .PRSACT ,CLOSE!-WORDS>
+                 <COND (,TRAP-DOOR!-FLAG
+                        <TELL
+"The door swings shut and closes.">)
+                       (<TELL "It's closed.">)>
+                 <COND-CLOSE DOWN!-DIRECTIONS .RM>
+                 T)>)
+         (<==? .RM <FIND-ROOM "CELLA">>
+          <COND (<==? .PRSACT ,OPEN!-WORDS>
+                 <TELL
+"The door is locked from above.">)
+                (<TELL <PICK-ONE ,DUMMY>>)>)>>
+
+<DEFINE LOOK-UNDER ("AUX" (OBJ <2 ,PRSVEC>))
+    #DECL ((OBJ) OBJECT)
+    <COND (<AND <==? .OBJ <FIND-OBJ "RUG">>
+               <NOT <ORAND .OBJ>>
+               <NOT ,TRAP-DOOR!-FLAG>>
+          <TELL "Underneath the rug is a closed trap door.">)
+         (<AND <==? .OBJ <FIND-OBJ "LEAVE">>
+               <N==? <RVARS <FIND-ROOM "CLEAR">> 1>>
+          <TELL "Underneath the pile of leaves is a grating.">)>>
+
+<DEFINE REPENT ()
+    <TELL "It could very well be too late!">>
+
+<DEFINE CLEARING ("AUX" (PRSACT <1 ,PRSVEC>) (RM ,HERE) (GRATE <FIND-OBJ "GRAT1">)
+                 (LEAVES <FIND-OBJ "LEAVE">) (RV <RVARS .RM>))
+  #DECL ((PRSACT) VERB (RM) ROOM (LEAVES GRATE) OBJECT (RV) FIX)
+  <COND (<==? .PRSACT ,LOOK!-WORDS>
+        <TELL 
+"You are in a clearing, with a forest surrounding you on the west
+and south.">
+        <COND (,KEY-FLAG!-FLAG
+               <TELL "There is an open grating, descending into darkness." 1>)
+              (<NOT <0? .RV>>
+               <TELL "There is a grating securely fastened into the ground." 1>)>)
+       (<AND <0? .RV>
+             <OR <AND <==? .PRSACT ,BURN!-WORDS>
+                      <NOT <0? <ORAND .LEAVES>>>>
+                 <==? .PRSACT ,TAKE!-WORDS>
+                 <==? .PRSACT ,MOVE!-WORDS>>
+             <==? <2 ,PRSVEC> .LEAVES>>
+        <TELL "A grating appears on the ground.">
+        <TRO .GRATE ,OVISON>
+        <PUT .RM ,RVARS 1>)>>
+
+; "CELLAR--FIRST ROOM IN BASEMENT."
+
+<DEFINE CELLAR ("AUX" (WIN ,WINNER) (PRSACT <1 ,PRSVEC>)
+               (DOOR <FIND-OBJ "DOOR">))
+  #DECL ((WIN) ADV (PRSACT) VERB (DOOR) OBJECT)
+  <COND (<==? .PRSACT ,LOOK!-WORDS>
+        <TELL 
+
+"You are in a dark and damp cellar with a narrow passageway leading
+east, and a crawlway to the south.  On the west is the bottom of a
+steep metal ramp which is unclimbable.">)
+       (<AND <==? <VNAME .PRSACT> WALK-IN!-WORDS>
+             ,TRAP-DOOR!-FLAG
+             <NOT <OTOUCH? .DOOR>>>
+        <SETG TRAP-DOOR!-FLAG <>>
+        <PUT .DOOR ,OTOUCH? T>
+        <TELL 
+"The trap door crashes shut, and you hear someone barring it." 1>)>>
+
+"STUDIO:  LET PEOPLE UP THE CHIMNEY IF THEY DON'T HAVE MUCH STUFF"
+
+<DEFINE CHIMNEY-FUNCTION ("AUX" (WINNER ,WINNER) (AOBJS <AOBJS .WINNER>))
+  #DECL ((WINNER) ADV (AOBJS) <LIST [REST OBJECT]>)
+  <COND (<AND <L=? <LENGTH .AOBJS> 2>
+             <MEMQ <FIND-OBJ "LAMP"> .AOBJS>>
+        <SETG LIGHT-LOAD!-FLAG T>
+        ;"Door will slam shut next time, too, since this way up don't count."
+        <COND (<NOT ,TRAP-DOOR!-FLAG>
+               <PUT <FIND-OBJ "DOOR"> ,OTOUCH? <>>)>
+        <>)
+       (T
+        <SETG LIGHT-LOAD!-FLAG <>>)>>
+
+; "OBJECT FUNCTIONS"
+
+<DEFINE RUG ("AUX" (PRSVEC ,PRSVEC) (PRSA <1 .PRSVEC>) OBJ)
+   #DECL ((PRSVEC) VECTOR (OBJ) OBJECT (PRSA) VERB)
+   <COND (<==? .PRSA ,LIFT!-WORDS>
+         <TELL 
+"The rug is too heavy to lift, but in trying to take it you have 
+noticed an irregularity beneath it.">)
+        (<==? .PRSA ,MOVE!-WORDS>
+         <COND (<ORAND <SET OBJ <FIND-OBJ "RUG">>>
+                <TELL
+"Having moved the carpet previously, you find it impossible to move
+it again.">)
+               (<TELL
+"With a great effort, the rug is moved to one side of the room.
+With the rug moved, the dusty cover of a closed trap-door appears.">
+                <TRO <FIND-OBJ "DOOR"> ,OVISON>
+                <PUT .OBJ ,ORAND T>)>)
+        (<==? .PRSA ,TAKE!-WORDS>
+         <TELL
+"The rug is extremely heavy and cannot be carried.">)>>
+
+<DEFINE RUSTY-KNIFE ("AUX" (PRSVEC ,PRSVEC) (PRSA <1 .PRSVEC>) (PRSI <3 .PRSVEC>))
+       #DECL ((PRSVEC) VECTOR (PRSA) VERB (PRSI) <OR FALSE OBJECT>)
+       <COND (<==? .PRSA ,TAKE!-WORDS>
+              <AND <MEMQ <FIND-OBJ "SWORD"> <AOBJS ,WINNER>>
+                   <TELL
+"As you pick up the rusty knife, your sword gives a single pulse
+of blinding blue light.">>
+              <>)
+             (<OR <==? .PRSA ,ATTAC!-WORDS>
+                  <==? .PRSA ,SWING!-WORDS>
+                  <AND <==? .PRSA ,THROW!-WORDS> .PRSI>
+                  <==? .PRSA ,KILL!-WORDS>>
+              <KILL-OBJ <FIND-OBJ "RKNIF"> ,WINNER>
+              <JIGS-UP
+"As the knife approaches its victim, your mind is submerged by an
+overmastering will.  Slowly, your hand turns, until the rusty blade
+is an inch from your neck.  The knife seems to sing as it savagely
+slits your throat.">)>>
+
+<DEFINE SKELETON ("AUX" (RM <1 ,WINNER>) (LLD <FIND-ROOM "LLD2">) L)
+   #DECL ((RM LLD) ROOM (L) <LIST [REST OBJECT]>)
+   <TELL 
+"A ghost appears in the room and is appalled at your having
+desecrated the remains of a fellow adventurer.  He casts a curse
+on all of your valuables and orders them banished to the Land of
+the Living Dead.  The ghost leaves, muttering obscenities.">
+   <SET L <ROB-ROOM .RM () 100>>
+   <SET L <ROB-ADV ,PLAYER .L>>
+   <MAPF <>
+        <FUNCTION (X) #DECL ((X) OBJECT)
+                  <PUT .X ,OROOM .LLD>>
+        .L>
+   <COND (<NOT <EMPTY? .L>>
+         <PUTREST <REST .L <- <LENGTH .L> 1>> <ROBJS .LLD>>
+         <PUT .LLD ,ROBJS .L>)>
+   T>
+
+<DEFINE TROLL ("AUX" (PA <1 ,PRSVEC>)
+              (PV ,PRSVEC) (PRSO <2 .PV>) (HERE ,HERE)
+                    (T <FIND-OBJ "TROLL">) (A <FIND-OBJ "AXE">))
+       #DECL ((PV) VECTOR (PRSO) <OR FALSE OBJECT> (WIN) ADV
+              (HERE) ROOM (T A) OBJECT (PA) VERB)
+       <COND (<==? .PA ,FIGHT!-WORDS>
+              <COND (<==? <OCAN .A> .T> <>)
+                    (<MEMQ .A <ROBJS ,HERE>>
+                     <SNARF-OBJECT .T .A>
+                     <AND <==? .HERE <OROOM .T>>
+                          <TELL
+"The troll, now worried about this encounter, recovers his bloody
+axe.">>
+                     T)
+                    (<==? .HERE <OROOM .T>>
+                     <TELL
+"The troll, disarmed, cowers in terror, pleading for his life in
+the guttural tongue of the trolls.">
+                     T)>)
+             (<==? .PA ,DEAD\!!-WORDS> <SETG TROLL-FLAG!-FLAG T>)
+             (<==? .PA ,OUT\!!-WORDS>
+              <TRZ <FIND-OBJ "AXE"> ,OVISON>
+              <PUT .T ,ODESC1 ,TROLLOUT>
+              <SETG TROLL-FLAG!-FLAG T>)
+             (<==? .PA ,IN\!!-WORDS>
+              <TRO <FIND-OBJ "AXE"> ,OVISON>
+              <COND (<==? <OROOM .T> .HERE>
+                     <TELL
+"The troll stirs, quickly resuming a fighting stance.">)>
+              <PUT .T ,ODESC1 ,TROLLDESC>
+              <SETG TROLL-FLAG!-FLAG <>>)
+             (<==? .PA ,FIRST?!-WORDS> <PROB 33>)
+             (<AND <OR <==? .PA ,THROW!-WORDS>
+                       <==? .PA ,GIVE!-WORDS>>
+                   .PRSO>
+              <COND (<==? .PA ,THROW!-WORDS>
+                     <TELL 
+"The troll, who is remarkably coordinated, catches the " 1 <ODESC2 .PRSO>>)
+                    (<TELL
+"The troll, who is not overly proud, graciously accepts the gift">)>
+              <COND (<==? .PRSO <FIND-OBJ "KNIFE">>
+                     <TELL
+"and being for the moment sated, throws it back.  Fortunately, the
+troll has poor control, and the knife falls to the floor.  He does
+not look pleased.">
+                     <TRO .T ,FIGHTBIT>)
+                    (<TELL 
+"and not having the most discriminating tastes, gleefully eats it.">
+                     <REMOVE-OBJECT <2 .PV>>)>)
+             (<OR <==? .PA ,TAKE!-WORDS>
+                  <==? .PA ,MOVE!-WORDS>>
+              <TELL 
+"The troll spits in your face, saying \"Better luck next time.\"">)
+             (<==? <VNAME .PA> MUNG!-WORDS>
+              <TELL
+"The troll laughs at your puny gesture.">)>>
+
+"MIRROR ROOM HACKERY"
+
+<DEFINE MIRROR-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+       #DECL ((PRSACT) VERB)
+       <COND (<AND <==? .PRSACT ,LOOK!-WORDS>
+                   <LIT? ,HERE>>
+              <TELL 
+"You are in a large square room with tall ceilings.  On the south wall
+is an enormous mirror which fills the entire wall.  There are exits
+on the other three sides of the room.">
+              <COND (,MIRROR-MUNG!-FLAG
+                     <TELL
+"Unfortunately, you have managed to destroy it by your reckless
+actions." 1>)>)>>
+
+<SETG MIRROR-MUNG!-FLAG <>>
+
+<DEFINE MIRROR-MIRROR ("AUX" (PRSACT <1 ,PRSVEC>) RM1 RM2 L1)
+       #DECL ((PRSACT) VERB (RM1 RM2) ROOM (L1) <LIST [REST OBJECT]>)
+       <COND (<AND <NOT ,MIRROR-MUNG!-FLAG>
+                   <==? <VNAME .PRSACT> RUB!-WORDS>>
+              <SET RM1 ,HERE>
+              <SET RM2
+                <COND (<==? .RM1 <FIND-ROOM "MIRR1">>
+                       <FIND-ROOM "MIRR2">)
+                      (<FIND-ROOM "MIRR1">)>>
+              <SET L1 <ROBJS .RM1>>
+              <PUT .RM1 ,ROBJS <ROBJS .RM2>>
+              <PUT .RM2 ,ROBJS .L1>
+              <MAPF <> <FUNCTION (X) #DECL ((X) OBJECT)
+                                 <PUT .X ,OROOM .RM1>>
+                    <ROBJS .RM1>>
+              <MAPF <> <FUNCTION (X) #DECL ((X) OBJECT)
+                                 <PUT .X ,OROOM .RM2>>
+                    <ROBJS .RM2>>
+              <GOTO .RM2>
+              <TELL 
+"There is a rumble from deep within the earth and the room shakes.">)
+             (<OR <==? .PRSACT ,LOOK!-WORDS>
+                  <==? .PRSACT ,EXAMI!-WORDS>>
+              <COND (,MIRROR-MUNG!-FLAG
+                     <TELL "The mirror is broken into many pieces.">)
+                    (<TELL "There is an ugly person staring at you.">)>)
+             (<==? .PRSACT ,TAKE!-WORDS>
+              <TELL
+"Nobody but a greedy surgeon would allow you to attempt that trick.">)
+             (<OR <==? <VNAME .PRSACT> MUNG!-WORDS>
+                  <==? <VNAME .PRSACT> THROW!-WORDS>>
+              <COND (,MIRROR-MUNG!-FLAG
+                     <TELL
+"Haven't you done enough already?">)
+                    (<SETG MIRROR-MUNG!-FLAG T>
+                     <TELL
+"You have broken the mirror.  I hope you have a seven years supply of
+good luck handy.">)>)>> 
+
+<DEFINE CAROUSEL-ROOM ("AUX" (PV ,PRSVEC)) 
+       #DECL ((PV) VECTOR)
+       <COND (<AND <==? <1 .PV> ,WALK-IN!-WORDS> ,CAROUSEL-ZOOM!-FLAG>
+              <JIGS-UP ,SPINDIZZY>)
+             (<==? <1 .PV> ,LOOK!-WORDS>
+              <TELL
+"You are in a circular room with passages off in eight directions." 1>
+              <COND (<NOT ,CAROUSEL-FLIP!-FLAG>
+                     <TELL
+"Your compass needle spins wildly, and you can't get your bearings." 1>)>)>>
+
+<DEFINE CAROUSEL-EXIT ("AUX" CX)
+       #DECL ((CX) <OR CEXIT NEXIT ROOM>)
+       <COND (,CAROUSEL-FLIP!-FLAG <>)
+             (<TELL "Unfortunately, it is impossible to tell directions in here." 1>
+              <CAROUSEL-OUT>)>>
+
+<DEFINE CAROUSEL-OUT ("AUX" CX)
+       #DECL ((CX) <OR CEXIT NEXIT ROOM>)
+       <AND <TYPE? <SET CX <NTH <REXITS ,HERE> <* 2 <+ 1 <MOD <RANDOM> 8>>>>> CEXIT>
+            <CXROOM .CX>>>
+
+<DEFINE TORCH-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+ #DECL ((PRSACT) VERB)
+ <COND (<==? .PRSACT ,LOOK!-WORDS>
+       <TELL
+
+"You are in a large room with a prominent doorway leading to a down
+staircase. To the west is a narrow twisting tunnel.  Above you is a
+large dome painted with scenes depicting elfin hacking rites. Up
+around the edge of the dome (20 feet up) is a wooden railing. In the
+center of the room there is a white marble pedestal.">
+       <COND (,DOME-FLAG!-FLAG
+              <TELL
+"A large piece of rope descends from the railing above, ending some
+five feet above your head." 1>)>)>>
+
+<DEFINE DOME-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+       #DECL ((PRSACT) VERB)
+       <COND (<==? .PRSACT ,LOOK!-WORDS>
+              <TELL 
+"You are at the periphery of a large dome, which forms the ceiling
+of another room below.  Protecting you from a precipitous drop is a
+wooden railing which circles the dome.">
+              <COND (,DOME-FLAG!-FLAG
+                     <TELL 
+
+"Hanging down from the railing is a rope which ends about ten feet
+from the floor below." 1>)>)
+             (<==? <VNAME .PRSACT> JUMP!-WORDS>
+              <JIGS-UP 
+"I'm afraid that the leap you attempted has done you in.">)>>
+
+<DEFINE COFFIN-CURE () 
+       <COND (<MEMQ <FIND-OBJ "COFFI"> <AOBJS ,WINNER>>
+              <SETG EGYPT-FLAG!-FLAG <>>)
+             (ELSE <SETG EGYPT-FLAG!-FLAG T>)>
+       <>>
+
+<DEFINE LLD-ROOM ("AUX" (PV ,PRSVEC) (WIN ,WINNER) (WOBJ <AOBJS .WIN>)
+                       (PA <1 .PV>) (CAND <FIND-OBJ "CANDL">))
+       #DECL ((PV) VECTOR (PA) VERB (WIN) ADV (WOBJ) <LIST [REST OBJECT]>
+              (CAND) OBJECT)
+       <COND (<==? .PA ,LOOK!-WORDS>
+              <TELL 
+
+"You are outside a large gateway, on which is inscribed 
+       \"Abandon every hope, all ye who enter here.\"  
+The gate is open; through it you can see a desolation, with a pile of
+mangled corpses in one corner.  Thousands of voices, lamenting some
+hideous fate, can be heard.">
+              <COND (<NOT ,LLD-FLAG!-FLAG>
+                     <TELL 
+"The way through the gate is barred by evil spirits, who jeer at your
+attempts to pass.">)>)
+             (<==? <VNAME .PA> EXORC!-WORDS>
+              <COND (<MEMQ <FIND-OBJ "GHOST"> <ROBJS ,HERE>>
+                     <COND (<AND <MEMQ <FIND-OBJ "BELL"> .WOBJ>
+                                 <MEMQ <FIND-OBJ "BOOK"> .WOBJ>
+                                 <MEMQ <SET CAND <FIND-OBJ "CANDL">> .WOBJ>
+                                 <G? <OLIGHT? .CAND> 0>>
+                            <TELL 
+
+"There is a clap of thunder, and a voice echoes through the cavern: 
+\"Begone, fiends!\"  The spirits, sensing the presence of a greater
+power, flee through the walls.">
+                            <REMOVE-OBJECT <FIND-OBJ "GHOST">>
+                            <SETG LLD-FLAG!-FLAG T>)
+                           (<TELL "You are not equipped for an exorcism.">)>)
+                    (<JIGS-UP
+"There is a clap of thunder, and a voice echoes through the
+cavern: \"Begone, chomper!\"  Apparently, the voice thinks you
+are an evil spirit, and dismisses you from the realm of the living.">)>)>>
+
+<DEFINE LLD2-ROOM ("AUX" (PRSA <1 ,PRSVEC>))
+    #DECL ((PRSA) VERB)
+    <COND (<==? .PRSA ,LOOK!-WORDS>
+          <TELL 
+"You have entered the Land of the Living Dead, a large desolate room.
+Although it is apparently uninhabited, you can hear the sounds of
+thousands of lost souls weeping and moaning.  In the east corner are
+stacked the remains of dozens of previous adventurers who were less
+fortunate than yourself.  To the east is an ornate passage,
+apparently recently constructed. "
+               1
+               <COND (,ON-POLE!-FLAG
+                               " Amid the desolation, you spot what
+appears to be your head, at the end of a long pole.") ("")>>)>>
+
+<DEFINE GHOST-FUNCTION ("AUX" (PV ,PRSVEC) (G <FIND-OBJ "GHOST">))
+  #DECL ((PV) VECTOR (G) OBJECT)
+  <COND (<==? <3 .PV> .G>
+        <TELL "How can you attack a spirit with material objects?">
+        <>)
+       (<==? <2 .PV> .G>
+        <TELL "You seem unable to affect these spirits.">)>>
+
+<DEFINE MAZE-11 ("AUX" (PRSACT <1 ,PRSVEC>))
+  #DECL ((PRSACT) VERB)
+  <COND (<==? .PRSACT ,LOOK!-WORDS>
+        <TELL 
+ "You are in a small room near the maze. There are twisty passages
+in the immediate vicinity.">
+        <COND (,KEY-FLAG!-FLAG
+               <TELL
+ "Above you is an open grating with sunlight pouring in.">)
+              (,GRUNLOCK!-FLAG
+               <TELL "Above you is a grating.">)
+              (<TELL
+ "Above you is a grating locked with a skull-and-crossbones lock.">)>)>>
+
+<DEFINE GRAT1-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (,GRUNLOCK!-FLAG
+          <OPEN-CLOSE .PRSACT
+                      KEY-FLAG!-FLAG
+                     "The grating opens."
+                     "The grating is closed.">)
+         (<TELL "The grating is locked.">)>>
+
+<DEFINE GRAT2-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (,GRUNLOCK!-FLAG
+          <OPEN-CLOSE .PRSACT
+                      KEY-FLAG!-FLAG
+                     "The grating opens to reveal trees above you."
+                     "The grating is closed.">
+          <TRO <FIND-OBJ "GRAT1"> ,OVISON>)
+         (<TELL "The grating is locked.">)>>
+
+<DEFINE TREASURE-ROOM ("AUX" (PV ,PRSVEC) (HACK ,ROBBER-DEMON)
+                      HH CHALI
+                      (HOBJ <HOBJ .HACK>) (FLG <>) TL (HERE ,HERE) (ROOMS ,ROOMS))
+  #DECL ((HACK) HACK (PV) <VECTOR VERB> (HH) <LIST [REST OBJECT]>
+        (HOBJ) OBJECT (FLG) <OR ATOM FALSE> (TL ROOMS) <LIST [REST ROOM]>
+        (HERE) ROOM)
+  <COND (<AND <HACTION .HACK>
+             <==? <VNAME <1 .PV>> WALK-IN!-WORDS>>
+        <COND (<SET FLG <N==? <OROOM .HOBJ> .HERE>>
+               <TELL
+"You hear a scream of anguish as you violate the robber's hideaway. 
+Using passages unknown to you, he rushes to its defense.">
+               <COND (<OROOM .HOBJ>
+                      <REMOVE-OBJECT .HOBJ>)>
+               <TRO .HOBJ ,FIGHTBIT>
+               <PUT .HACK ,HROOM .HERE>
+               <PUT .HACK ,HROOMS <COND (<EMPTY? <SET TL <REST <MEMQ .HERE .ROOMS>>>>
+                                         .ROOMS)
+                                        (.TL)>>
+               <INSERT-OBJECT .HOBJ .HERE>)
+              (T
+               <TRO .HOBJ ,FIGHTBIT>)>
+        <AND <NOT <OCAN <SET CHALI <FIND-OBJ "CHALI">>>>
+             <==? <OROOM .CHALI> .HERE>
+             <TRZ .CHALI ,TAKEBIT>>
+        <COND (<NOT <LENGTH? <ROBJS .HERE> 2>>
+               <TELL
+"The thief gestures mysteriously, and the treasures in the room
+suddenly vanish.">)>
+        <MAPF <>
+          <FUNCTION (X) #DECL ((X) OBJECT)
+            <COND (<AND <N==? .X .CHALI>
+                        <N==? .X .HOBJ>>
+                   <TRZ .X ,OVISON>)>>
+          <ROBJS .HERE>>)>>
+
+<DEFINE TREAS () 
+       <COND (<AND <==? <1 ,PRSVEC> ,TREAS!-WORDS>
+                   <==? ,HERE <FIND-ROOM "TEMP1">>>
+              <GOTO <FIND-ROOM "TREAS">>
+              <ROOM-DESC>)
+             (<AND <==? <1 ,PRSVEC> ,TEMPL!-WORDS>
+                   <==? ,HERE <FIND-ROOM "TREAS">>>
+              <GOTO <FIND-ROOM "TEMP1">>
+              <ROOM-DESC>)
+             (T <TELL "Nothing happens.">)>>
+
+<DEFINE PRAYER () 
+  <COND (<AND <==? ,HERE <FIND-ROOM "TEMP2">>
+             <GOTO <FIND-ROOM "FORE1">>>
+        <ROOM-DESC>)
+       (<TELL
+"If you pray enough, your prayers may be answered.">)>>
+
+<SETG GATE-FLAG!-FLAG <>>
+
+<DEFINE DAM-ROOM ("AUX" (PRSACT <1 ,PRSVEC>)) 
+   #DECL ((PRSACT) VERB)
+   <COND
+    (<==? .PRSACT ,LOOK!-WORDS>
+     <TELL 
+"You are standing on the top of the Flood Control Dam #3, which was
+quite a tourist attraction in times far distant.  There are paths to
+the north, south, east, and down.">
+     <COND (,LOW-TIDE!-FLAG
+           <TELL 
+"It appears that the dam has been opened since the water level behind
+it is low and the sluice gate has been opened.  Water is rushing
+downstream through the gates." 1>)
+          (<TELL 
+"The sluice gates on the dam are closed.  Behind the dam, there can be
+seen a wide lake.  A small stream is formed by the runoff from the
+lake." 1>)>
+     <TELL 
+"There is a control panel here.  There is a large metal bolt on the 
+panel. Above the bolt is a small green plastic bubble." 1>
+     <COND (,GATE-FLAG!-FLAG <TELL "The green bubble is glowing." 1>)>)>>
+
+<DEFINE BOLT-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>) (PRSI <3 ,PRSVEC>) 
+                            (TRUNK <FIND-OBJ "TRUNK">)) 
+       #DECL ((PRSACT) VERB (TRUNK) OBJECT (PRSI) <OR FALSE OBJECT>)
+       <COND (<==? .PRSACT ,TURN!-WORDS>
+              <COND (<==? .PRSI <FIND-OBJ "WRENC">>
+                     <COND (,GATE-FLAG!-FLAG
+                            <COND (,LOW-TIDE!-FLAG
+                                   <SETG LOW-TIDE!-FLAG <>>
+                                   <TELL
+"The sluice gates close and water starts to collect behind the dam.">
+                                   <AND <MEMQ .TRUNK <ROBJS <FIND-ROOM "RESES">>>
+                                        <TRZ .TRUNK ,OVISON>>
+                                   T)
+                                  (<SETG LOW-TIDE!-FLAG T>
+                                   <TELL
+"The sluice gates open and water pours through the dam.">
+                                   <TRO .TRUNK ,OVISON>)>)
+                           (<TELL
+"The bolt won't turn with your best effort.">)>)
+                    (<TYPE? .PRSI OBJECT>
+                     <TELL
+"The bolt won't turn using the " 1 <ODESC2 .PRSI> ".">)>)>>
+
+<PSETG DROWNINGS
+      '["up to your ankles."
+       "up to your shin."
+       "up to your knees."
+       "up to your hips."
+       "up to your waist."
+       "up to your chest."
+       "up to your neck."
+       "over your head."
+       "high in your lungs."]>
+
+<GDECL (DROWNINGS) <VECTOR [REST STRING]>>
+
+<DEFINE MAINT-ROOM ("AUX" (PV ,PRSVEC) (PRSACT <1 .PV>) (PRSO <2 .PV>)
+                         (PRSI <3 .PV>) (MNT <FIND-ROOM "MAINT">)
+                         (HERE? <==? ,HERE .MNT>) HACK)
+       #DECL ((PRSACT) VERB (PRSI) <OR FALSE OBJECT> (HERE?) <OR ATOM FALSE>
+              (MNT) ROOM (PRSO) PRSOBJ (HACK) FIX)
+       <COND (<==? .PRSACT ,C-INT!-WORDS>
+              <PUT .MNT ,RVARS <+ 1 <SET HACK <RVARS .MNT>>>>
+              <COND (<AND .HERE?
+                          <TELL "The water level here is now "
+                                1
+                                <NTH ,DROWNINGS <+ 1 </ <SET HACK <RVARS .MNT>>
+                                                        2>>>>>)>
+              <COND (<G=? <SET HACK <RVARS .MNT>> 16>
+                     <MUNG-ROOM .MNT
+                                
+"The room is full of water and cannot be entered.">
+                     <CLOCK-INT ,MNTIN 0>
+                     <AND .HERE?
+                          <JIGS-UP "I'm afraid you have done drowned yourself."
+>>)>)>
+       <COND (<==? <VNAME .PRSACT> PUSH!-WORDS>
+              <COND (<==? .PRSO <FIND-OBJ "BLBUT">>
+                     <COND (<0? <SET HACK <RVARS ,HERE>>>
+                            <TELL 
+"There is a rumbling sound and a stream of water appears to burst
+from the east wall of the room (apparently, a leak has occurred in a
+pipe.)">
+                            <PUT ,HERE ,RVARS 1>
+                            <CLOCK-INT ,MNTIN -1>
+                            T)
+                           (<TELL "The blue button appears to be jammed.">)>)
+                    (<==? .PRSO <FIND-OBJ "RBUTT">>
+                     <PUT ,HERE ,RLIGHT? <NOT <RLIGHT? ,HERE>>>
+                     <COND (<RLIGHT? ,HERE>
+                            <TELL "The lights within the room come on.">)
+                           (<TELL "The lights within the room shut off.">)>)
+                    (<==? .PRSO <FIND-OBJ "BRBUT">>
+                     <SETG GATE-FLAG!-FLAG <>>
+                     <TELL "Click.">)
+                    (<==? .PRSO <FIND-OBJ "YBUTT">>
+                     <SETG GATE-FLAG!-FLAG T>
+                     <TELL "Click.">)>)>>
+
+<DEFINE LEAK-FUNCTION ("AUX" HACK
+                      (PRSVEC ,PRSVEC) (PRSA <1 .PRSVEC>) (PRSI <3 .PRSVEC>))
+       #DECL ((PRSVEC) <VECTOR [3 ANY]> (PRSA) VERB (PRSI) <OR OBJECT FALSE>
+              (HACK) FIX)
+       <COND (<==? <2 .PRSVEC> <FIND-OBJ "LEAK">>
+              <COND (<AND <==? <VNAME .PRSA> PLUG!-WORDS>
+                          <G? <SET HACK <RVARS ,HERE>> 0>>
+                     <COND (<==? .PRSI <FIND-OBJ "PUTTY">>
+                            <PUT ,HERE ,RVARS -1>
+                            <CLOCK-INT ,MNTIN 0>
+                            <TELL
+"By some miracle of elven technology, you have managed to stop the
+leak in the dam.">)
+                           (<WITH-TELL .PRSI>)>)>)>>
+
+<DEFINE TUBE-FUNCTION ("AUX" (PRSVEC ,PRSVEC))
+       #DECL ((PRSVEC) <VECTOR [3 ANY]>)
+       <COND (<AND <==? <1 .PRSVEC> ,PUT!-WORDS>
+                   <==? <3 .PRSVEC> <FIND-OBJ "TUBE">>>
+              <TELL "The tube refuses to accept anything.">)>>
+
+<DEFINE WITH-TELL (OBJ)
+    #DECL ((OBJ) OBJECT)
+    <TELL "With a " 1 <ODESC2 .OBJ> "?">>
+
+<DEFINE CAVE2-ROOM ("AUX" FOO BAR (PRSACT <1 ,PRSVEC>) C)
+  #DECL ((FOO) <VECTOR FIX CEVENT> (BAR) CEVENT (PRSACT) VERB (C) OBJECT)
+  <COND (<==? <VNAME .PRSACT> WALK-IN!-WORDS>
+        <AND <MEMQ <SET C <FIND-OBJ "CANDL">> <AOBJS ,WINNER>>
+             <PROB 50>
+             <1? <OLIGHT? .C>>
+             <CLOCK-DISABLE <SET BAR <2 <SET FOO <ORAND .C>>>>>
+             <PUT .C ,OLIGHT? -1>
+             <TELL 
+"The cave is very windy at the moment and your candles have blown out.">>)>>
+
+<DEFINE BOTTLE-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+  #DECL ((PRSACT) VERB)
+  <COND (<==? <1 .PRSACT> THROW!-WORDS>
+        <TELL "The bottle hits the far wall and is decimated.">
+        <REMOVE-OBJECT <2 ,PRSVEC>>)
+       (<==? <1 .PRSACT> MUNG!-WORDS>
+        <COND (<MEMQ <2 ,PRSVEC> <AOBJS ,WINNER>>
+               <PUT ,WINNER ,AOBJS <SPLICE-OUT <2 ,PRSVEC> <AOBJS ,WINNER>>>
+               <TELL "You have destroyed the bottle.  Well done.">)
+              (<MEMQ <2 ,PRSVEC> <ROBJS ,HERE>>
+               <PUT ,HERE ,ROBJS <SPLICE-OUT <2 ,PRSVEC> <ROBJS ,HERE>>>
+               <TELL "A brilliant maneuver destroys the bottle.">)>)>>
+       
+<DEFINE FILL ("AUX" (REM <>) (PRSVEC ,PRSVEC) (W <FIND-OBJ "WATER">))
+  #DECL ((REM) <OR ATOM FALSE> (PRSVEC) <VECTOR VERB OBJECT ANY> (W) OBJECT)
+  <COND (<OBJECT-ACTION>)
+       (<OR <RTRNN ,HERE ,RFILLBIT>
+            <SET REM <OR <==? <OCAN .W> <AVEHICLE ,WINNER>>
+                         <==? <OROOM .W> ,HERE>>>>
+        <PUT .PRSVEC 1 ,TAKE!-WORDS>
+        <PUT .PRSVEC 3 <2 .PRSVEC>>
+        <PUT .PRSVEC 2 .W>
+        <WATER-FUNCTION .REM>)
+       (<TELL "I can't find any water here.">)>>
+
+<DEFINE WATER-FUNCTION ("OPTIONAL" (REM T)
+                       "AUX" (PRSVEC ,PRSVEC) (PRSACT <1 .PRSVEC>) (ME ,WINNER)
+                             (B <FIND-OBJ "BOTTL">) (W <2 .PRSVEC>)
+                             (AV <AVEHICLE .ME>) (CAN <3 .PRSVEC>))
+       #DECL ((PRSACT) VERB (ME) ADV (B W) OBJECT (REM) <OR ATOM FALSE>
+              (PRSVEC) <VECTOR [3 ANY]> (AV) <OR OBJECT FALSE> (CAN) <OR FALSE OBJECT>)
+       <COND (<OR <==? .PRSACT ,TAKE!-WORDS>
+                  <==? .PRSACT ,PUT!-WORDS>>
+              <COND (<AND .AV <==? .AV .CAN>>
+                    <TELL "There is now a puddle in the bottom of the "
+                           1
+                           <ODESC2 .AV>
+                           ".">
+                     <COND (<MEMQ .W <AOBJS .ME>>
+                            <DROP-OBJECT .W .ME>)>
+                     <COND (<MEMQ .W <OCONTENTS .AV>>)
+                           (<PUT .AV ,OCONTENTS (.W !<OCONTENTS .AV>)>
+                            <PUT .W ,OCAN .AV>)>)
+                    (<AND .CAN <N==? .CAN .B>>
+                     <TELL "The water leaks out of the " 1 <ODESC2 .CAN>
+                           " and evaporates immediately.">
+                     <COND (<MEMQ .W <AOBJS .ME>>
+                            <DROP-OBJECT .W .ME>)
+                           (<REMOVE-OBJECT .W>)>)
+                    (<MEMQ .B <AOBJS .ME>>
+                     <COND (<NOT <EMPTY? <OCONTENTS .B>>>
+                            <TELL "The bottle is already full.">)
+                           (<NOT <OOPEN? .B>>
+                            <TELL "The bottle is closed.">)
+                           (T
+                            <AND .REM <REMOVE-OBJECT .W>>
+                            <PUT .B ,OCONTENTS (.W)>
+                            <PUT .W ,OCAN .B>
+                            <TELL "The bottle is now full of water.">)>)
+                    (<AND <==? <OCAN .W> .B>
+                          <==? .PRSACT ,TAKE!-WORDS>
+                          <NOT .CAN>>
+                     <PUT .PRSVEC 2 .B>
+                     <TAKE T>
+                     <PUT .PRSVEC 2 .W>)
+                    (<TELL "The water slips through your fingers.">)>)
+             (<OR <==? .PRSACT ,DROP!-WORDS>
+                  <==? .PRSACT ,POUR!-WORDS>
+                  <==? .PRSACT ,GIVE!-WORDS>>
+              <COND (<MEMQ .W <AOBJS .ME>>
+                     <DROP-OBJECT .W .ME>)>
+              <COND (.AV
+                     <TELL "There is now a puddle in the bottom of the "
+                           1
+                           <ODESC2 .AV>
+                           ".">)
+                    (<TELL "The water spills to the floor and evaporates immediately.">
+                     <REMOVE-OBJECT .W>)>)
+             (<==? .PRSACT ,THROW!-WORDS>
+              <TELL "The water splashes on the walls, and evaporates immediately.">
+              <REMOVE-OBJECT .W>)>>
+
+<DEFINE ROPE-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>) (DROOM <FIND-ROOM "DOME">)
+                      (ROPE <FIND-OBJ "ROPE">) (WIN ,WINNER))
+  #DECL ((PRSACT) VERB (ROPE) OBJECT (WIN) ADV (DROOM) ROOM)
+  <COND (<N==? ,HERE .DROOM>
+        <SETG DOME-FLAG!-FLAG <>>
+        <COND (<==? <VNAME .PRSACT> TIE!-WORDS>
+               <TELL "There is nothing it can be tied to.">)
+              (<==? <VNAME .PRSACT> UNTIE!-WORDS>
+               <TELL "It is not tied to anything.">)>)
+       (<AND <==? <VNAME .PRSACT> TIE!-WORDS>
+             <==? <3 ,PRSVEC> <FIND-OBJ "RAILI">>>
+        <COND (,DOME-FLAG!-FLAG
+               <TELL "The rope is already attached.">)
+              (<TELL 
+"The rope drops over the side and comes within ten feet of the floor.">
+               <SETG DOME-FLAG!-FLAG T>
+               <TRO .ROPE ,NDESCBIT>
+               <COND (<NOT <OROOM .ROPE>>
+                      <PUT .WIN ,AOBJS <SPLICE-OUT .ROPE <AOBJS .WIN>>>
+                      <INSERT-OBJECT .ROPE .DROOM>)>)>)
+       (<==? <VNAME .PRSACT> UNTIE!-WORDS>
+        <COND (,DOME-FLAG!-FLAG
+               <SETG DOME-FLAG!-FLAG <>>
+               <TRZ .ROPE ,NDESCBIT>
+               <TELL 
+"Although you tied it incorrectly, the rope becomes free.">)
+              (<TELL "It is not tied to anything.">)>)
+       (<AND <==? .PRSACT ,DROP!-WORDS>
+             <NOT ,DOME-FLAG!-FLAG>>
+        <REMOVE-OBJECT .ROPE>
+        <INSERT-OBJECT .ROPE <FIND-ROOM "TORCH">>
+        <TELL "The rope drops gently to the floor below.">)
+       (<AND <==? .PRSACT ,TAKE!-WORDS>
+             ,DOME-FLAG!-FLAG
+             <TELL "The rope is tied to the railing.">>)>>
+
+<DEFINE CYCLOPS ("AUX" (PRSACT <1 ,PRSVEC>) (PRSOB1 <2 ,PRSVEC>) (RM ,HERE)
+                      (FOOD <FIND-OBJ "FOOD">) (DRINK <FIND-OBJ "WATER">)
+                      (COUNT <RVARS .RM>) (GARLIC <FIND-OBJ "GARLI">) CYC)
+       #DECL ((PRSACT) VERB (PRSOB1) <OR OBJECT FALSE> (RM) ROOM (FOOD DRINK) OBJECT
+              (CYC GARLIC) OBJECT (COUNT) FIX)
+       <COND (,CYCLOPS-FLAG!-FLAG
+              <COND (<OR <==? .PRSACT ,AWAKE!-WORDS>
+                         <==? .PRSACT ,MUNG!-WORDS>
+                         <==? .PRSACT ,BURN!-WORDS>
+                         <==? .PRSACT ,FIGHT!-WORDS>>
+                     <TELL
+"The cyclops yawns and stares at the thing that woke him up.">
+                     <SETG CYCLOPS-FLAG!-FLAG <>>
+                     <TRZ <SET CYC <FIND-OBJ "CYCLO">> ,SLEEPBIT>
+                     <TRO .CYC ,FIGHTBIT>
+                     <PUT .RM ,RVARS <ABS <RVARS .RM>>>
+                     T)>)
+             (<G? <ABS .COUNT> 5>
+              <JIGS-UP
+"The cyclops, tired of all of your games and trickery, eats you.
+The cyclops says 'Mmm.  Just like mom used to make 'em.'">)
+             (<==? <VNAME .PRSACT> GIVE!-WORDS>
+              <COND (<==? .PRSOB1 .FOOD>
+                     <COND (<G=? .COUNT 0>
+                            <REMOVE-OBJECT .FOOD>
+                            <TELL 
+"The cyclops says 'Mmm Mmm.  I love hot peppers!  But oh, could I use
+a drink.  Perhaps I could drink the blood of that thing'.  From the
+gleam in his eye, it could be surmised that you are 'that thing'.">
+                            <PUT .RM ,RVARS <MIN -1 <- .COUNT>>>)>)
+                    (<==? .PRSOB1 .DRINK>
+                     <COND (<L? .COUNT 0>
+                            <REMOVE-OBJECT .DRINK>
+                            <TRO <SET CYC <FIND-OBJ "CYCLO">> ,SLEEPBIT>
+                            <TRZ .CYC ,FIGHTBIT>
+                            <TELL 
+"The cyclops looks tired and quickly falls fast asleep (what did you
+put in that drink, anyway?).">
+                            <SETG CYCLOPS-FLAG!-FLAG T>)
+                           (<TELL 
+"The cyclops apparently was not thirsty at the time and refuses your
+generous gesture.">
+                            <>)>)
+                    (<==? .PRSOB1 .GARLIC>
+                     <TELL "The cyclops may be hungry, but there is a limit.">
+                     <PUT .RM ,RVARS <AOS-SOS .COUNT>>)
+                    (<TELL "The cyclops is not so stupid as to eat THAT!">
+                     <PUT .RM ,RVARS <AOS-SOS .COUNT>>)>)
+             (<OR <==? .PRSACT ,FIRST?!-WORDS>
+                  <==? .PRSACT ,FIGHT!-WORDS>> <>)
+             (<AND <PUT .RM ,RVARS <AOS-SOS .COUNT>> <>>)
+             (<OR <==? .PRSACT ,THROW!-WORDS>
+                  <==? <VNAME .PRSACT> MUNG!-WORDS>>
+              <COND (<PROB 50>
+                     <TELL
+
+"Your actions don't appear to be doing much harm to the cyclops, but
+they do not exactly lower your insurance premiums, either.">)
+                    (<TELL
+"The cyclops ignores all injury to his body with a shrug.">)>)
+             (<==? .PRSACT ,TAKE!-WORDS>
+              <TELL 
+"The cyclops is rather heavy and doesn't take kindly to being grabbed.">)
+             (<==? .PRSACT ,TIE!-WORDS>
+              <TELL
+"You cannot tie the cyclops, although he is fit to be tied.">)>>
+
+<DEFINE CYCLOPS-ROOM ("AUX" (PV ,PRSVEC) (RM ,HERE) (VARS <RVARS .RM>)) 
+       #DECL ((PV) VECTOR (RM) ROOM (VARS) FIX)
+       <COND (<==? <1 .PV> ,LOOK!-WORDS>
+              <TELL 
+"You are in a room with an exit on the west side, and a staircase
+leading up.">
+              <COND (<AND ,CYCLOPS-FLAG!-FLAG <NOT ,MAGIC-FLAG!-FLAG>>
+                     <TELL 
+"The cyclops, perhaps affected by a drug in your drink, is sleeping
+blissfully at the foot of the stairs.">)
+                    (,MAGIC-FLAG!-FLAG
+                     <TELL 
+"On the north of the room is a wall which used to be solid, but which
+now has a cyclops-sized hole in it.">)
+                    (<0? .VARS>
+                     <TELL 
+"A cyclops, who looks prepared to eat horses (much less mere
+adventurers), blocks the staircase.  From his state of health, and
+the bloodstains on the walls, you gather that he is not very
+friendly, though he likes people." 1>)
+                    (<G? .VARS 0>
+                     <TELL 
+"The cyclops is standing in the corner, eyeing you closely.  I don't
+think he likes you very much.  He looks extremely hungry even for a
+cyclops.">)
+                    (<L? .VARS 0>
+                     <TELL 
+"The cyclops, having eaten the hot peppers, appears to be gasping.
+His enflamed tongue protrudes from his man-sized mouth.">)>
+              <COND (,CYCLOPS-FLAG!-FLAG)
+                    (<OR <0? .VARS> <TELL <NTH ,CYCLOMAD <ABS .VARS>>>>)>)>>
+
+<PSETG CYCLOMAD
+      '["The cyclops seems somewhat agitated."
+       "The cyclops appears to be getting more agitated."
+       "The cyclops is moving about the room, looking for something."
+       
+"The cyclops was looking for salt and pepper.  I think he is gathering
+condiments for his upcoming snack."
+       "The cyclops is moving toward you in an unfriendly manner."
+       "You have two choices: 1. Leave  2. Become dinner."]>
+
+<GDECL (CYCLOMAD) <VECTOR [REST STRING]>>
+
+<DEFINE AOS-SOS (FOO)
+  #DECL ((FOO) FIX)
+  <COND (<L? .FOO 0> <SET FOO <- .FOO 1>>)
+       (<SET FOO <+ .FOO 1>>)>
+  <COND (,CYCLOPS-FLAG!-FLAG)
+       (<TELL <NTH ,CYCLOMAD <ABS .FOO>>>)>
+  .FOO>
+
+<SETG ECHO-FLAG!-FLAG <>>
+
+<DEFINE ECHO-ROOM ("AUX" (READER-STRING ,READER-STRING)
+                  (B ,INBUF) L (RM <FIND-ROOM "ECHO">) (OUTCHAN ,OUTCHAN)
+                  VERB (WALK ,WALK!-WORDS)) 
+       #DECL ((OUTCHAN) CHANNEL (WALK VERB) VERB
+              (READER-STRING) STRING (PRSACT) VERB (B) STRING (L) FIX (RM) ROOM)
+       <COND (,ECHO-FLAG!-FLAG)
+             (<UNWIND
+               <PROG ()
+                <MAPF <>
+                  <FUNCTION (OBJ) #DECL ((OBJ) OBJECT)
+                    <COND (<OVIS? .OBJ>
+                           <TRO .OBJ ,ECHO-ROOM-BIT>
+                           <TRZ .OBJ ,OVISON>)>>
+                  <ROBJS .RM>>
+               <REPEAT ((PRSVEC ,PRSVEC) RANDOM-ACTION)
+                      #DECL ((PRSVEC) VECTOR)
+                      <SET L
+                           <READSTRING .B
+                                       ,INCHAN
+                                       .READER-STRING>>
+                      <READCHR ,INCHAN>
+                      <OR ,ALT-FLAG <READCHR ,INCHAN>>
+                      <SETG MOVES <+ ,MOVES 1>>
+                      <COND (<AND <EPARSE <LEX .B <REST .B .L> T> T>
+                                  <==? <SET VERB <1 .PRSVEC>> .WALK>
+                                  <2 .PRSVEC>
+                                  <MEMQ <CHTYPE <2 .PRSVEC> ATOM>
+                                        <REXITS .RM>>>
+                             <SET RANDOM-ACTION <VFCN .VERB>>
+                             <APPLY-RANDOM .RANDOM-ACTION>
+                             <COND (<N==? ,HERE .RM>
+                                    <MAPF <>
+                                      <FUNCTION (X) #DECL ((X) OBJECT)
+                                        <COND (<TRNN .X ,ECHO-ROOM-BIT>
+                                               <TRZ .X ,ECHO-ROOM-BIT>
+                                               <TRO .X ,OVISON>)>>
+                                      <ROBJS .RM>>)>
+                             <RETURN T>)
+                            (<PRINTSTRING .B .OUTCHAN .L>
+                             <SETG TELL-FLAG T>
+                             <CRLF>
+                             <COND (<==? <MEMBER "ECHO" <UPPERCASE .B>> .B>
+                                    <TELL "The acoustics of the room change subtly."
+                                          1>
+                                    <SETG ECHO-FLAG!-FLAG T>
+                                    <MAPF <>
+                                          <FUNCTION (X) #DECL ((X) OBJECT)
+                                                    <COND (<TRNN .X ,ECHO-ROOM-BIT>
+                                                           <TRZ .X ,ECHO-ROOM-BIT>
+                                                           <TRO .X ,OVISON>)>>
+                                          <ROBJS .RM>>
+                                    <RETURN T>)>)>>>
+               <PROG ()
+                     <GOTO <FIND-ROOM "CHAS3">>
+                     <SETG MOVES <+ ,MOVES 1>>
+                     <MAPF <>
+                           <FUNCTION (X) #DECL ((X) OBJECT)
+                             <COND (<TRNN .X ,ECHO-ROOM-BIT>
+                                    <TRZ .X ,ECHO-ROOM-BIT>
+                                    <TRO .X ,OVISON>)>>
+                           <ROBJS .RM>>>>)>>
+
+<DEFINE LEAPER ("AUX" (RM ,HERE) (EXITS <REXITS .RM>) M)
+   #DECL ((RM) ROOM (EXITS) EXIT (M) <OR <PRIMTYPE VECTOR> FALSE>)
+   <COND (<SET M <MEMQ DOWN!-WORDS .EXITS>>
+         <COND (<OR <TYPE? <2 .M> NEXIT>
+                    <AND <TYPE? <2 .M> CEXIT>
+                         <NOT <CXFLAG <2 .M>>>>>
+                <JIGS-UP <PICK-ONE ,JUMPLOSS>>)>)
+        (<TELL <PICK-ONE ,WHEEEEE>>)>>
+
+<DEFINE SKIPPER ()
+    <TELL <PICK-ONE ,WHEEEEE>>>
+
+<SETG HS 0>
+<GDECL (HS) FIX>
+<DEFINE HELLO ("AUX" (PRSOBJ <2 ,PRSVEC>) (AMT <SETG HS <+ ,HS 1>>))
+    #DECL ((PRSOBJ) <OR OBJECT FALSE> (AMT) FIX)
+    <COND (.PRSOBJ
+          <COND (<==? .PRSOBJ <FIND-OBJ "SAILO">>
+                 <COND (<0? <MOD .AMT 20>>
+                        <TELL
+"You seem to be repeating yourself.">)
+                       (<0? <MOD .AMT 10>>
+                        <TELL
+"I think that phrase is getting a bit worn out.">)
+                       (<TELL 
+"Nothing happens here.">)>)
+                (<==? .PRSOBJ <FIND-OBJ "AVIAT">>
+                 <TELL "Here, nothing happens.">)
+                (<TELL
+"I think that only schizophrenics say 'Hello' to a " 1 <ODESC2 .PRSOBJ> ".">)>)
+         (<TELL <PICK-ONE ,HELLOS>>)>>
+
+<PSETG HELLOS
+      '["Hello."
+       "Good day."
+       "Nice weather we've been having lately"
+       "How are you?"
+       "Goodbye."]>
+
+<PSETG WHEEEEE
+      '["Very good.  Now you can go to the second grade."
+       "Have you tried hopping around the dungeon, too?"
+       "Are you enjoying yourself?"
+       "Wheeeeeeeeee!!!!!"
+       "Do you expect me to applaud?"]>
+
+<PSETG JUMPLOSS
+      '["You should have looked before you leaped."
+       "I'm afraid that leap was a bit much for your weak frame."
+       "In the movies, your life would be passing in front of your eyes."
+       "Geronimo....."]>
+
+<GDECL (HELLOS WHEEEEE JUMPLOSS) <VECTOR [REST STRING]>>
+
+<DEFINE READER ("AUX" (PV ,PRSVEC) (PO <2 .PV>) (PI <3 .PV>))
+    #DECL ((PV) VECTOR (PO) OBJECT (PI) <OR FALSE OBJECT>)
+    <COND (<NOT <LIT? ,HERE>>
+          <TELL "It is impossible to read in the dark.">)
+         (<AND .PI <NOT <TRANSPARENT? .PI>>>
+          <TELL "How does one look through a " 1 <ODESC2 .PI> "?">)
+         (<NOT <READABLE? .PO>>
+          <TELL "How can I read a " 1 <ODESC2 .PO> "?">)
+         (<OBJECT-ACTION>)
+         (<TELL <OREAD .PO>>)>>
+         
+<DEFINE WELL ()
+    <COND (,RIDDLE-FLAG!-FLAG <TELL "Well what?">)
+         (<==? ,HERE <FIND-ROOM "RIDDL">>
+          <SETG RIDDLE-FLAG!-FLAG T>
+          <TELL
+"There is a clap of thunder and the east door opens.">)
+         (<TELL "Well what?">)>>
+
+<DEFINE SINBAD ()
+    <COND (<AND <==? ,HERE <FIND-ROOM "CYCLO">>
+               <MEMQ <FIND-OBJ "CYCLO"> <ROBJS ,HERE>>>
+          <SETG CYCLOPS-FLAG!-FLAG T>
+          <TELL
+"The cyclops, hearing the name of his deadly nemesis, flees the room
+by knocking down the wall on the north of the room.">
+          <SETG MAGIC-FLAG!-FLAG T>
+          <REMOVE-OBJECT <FIND-OBJ "CYCLO">>)
+         (<TELL 
+"Wasn't he a sailor?">)>>
+
+<DEFINE GRANITE ()
+    <TELL "I think you are taking this thing for granite.">>
+
+<PSETG DUMMY
+      '["Look around."
+       "You think it isn't?"
+       "I think you've already done that."]>
+
+<GDECL (DUMMY) <VECTOR [REST STRING]>>
+
+<DEFINE BRUSH ("AUX" (PRSO <2 ,PRSVEC>) (PRSI <3 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT (PRSI) <OR OBJECT FALSE>)
+    <COND (<==? .PRSO <FIND-OBJ "TEETH">>
+          <COND (<AND <==? .PRSI <FIND-OBJ "PUTTY">>
+                      <MEMQ .PRSI <AOBJS ,WINNER>>>
+                 <JIGS-UP
+"Well, you seem to have been brushing your teeth with some sort of
+glue. As a result, your mouth gets glued together (with your nose)
+and you die of respiratory failure.">)
+                (<NOT .PRSI>
+                 <TELL
+"Dental hygiene is highly recommended, but I'm not sure what you want
+to brush them with.">)
+                (<TELL
+"A nice idea, but with a " 1 <ODESC2 .PRSI> "?">)>)
+         (<TELL
+"If you wish, but I can't understand why??">)>>
+
+<DEFINE RING ("AUX" (PRSOBJ <2 ,PRSVEC>))
+    #DECL ((PRSOBJ) <OR OBJECT FALSE>)
+    <COND (<==? .PRSOBJ <FIND-OBJ "BELL">>
+          <TELL
+"Ding, dong.">)
+         (<TELL
+"How, exactly, can I ring that?">)>>
+
+<DEFINE EAT ("AUX" (PRSVEC ,PRSVEC) (EAT? <>) (DRINK? <>) (PRSOBJ <2 .PRSVEC>)
+            NOBJ (AOBJS <AOBJS ,WINNER>))
+    #DECL ((PRSOBJ) OBJECT (NOBJ) <OR OBJECT FALSE> (PRSVEC) <VECTOR [3 ANY]>
+          (AOBJS) <LIST [REST OBJECT]> (EAT? DRINK?) <OR ATOM FALSE>)
+    <COND (<OBJECT-ACTION>)
+         (<AND <SET EAT? <EDIBLE? .PRSOBJ>> <MEMQ .PRSOBJ .AOBJS>>
+          <COND (<==? <1 .PRSVEC> ,DRINK!-WORDS>
+                 <TELL "How can I drink that?">)
+                (<TELL
+"Thank you very much.  It really hit the spot.">
+                 <PUT ,WINNER ,AOBJS <SPLICE-OUT .PRSOBJ .AOBJS>>)>)
+         (<AND <SET DRINK? <DRINKABLE? .PRSOBJ>>
+               <SET NOBJ <OCAN .PRSOBJ>>
+               <MEMQ .NOBJ .AOBJS>>
+          <COND (<OOPEN? .NOBJ>
+                 <TELL
+"Thank you very much.  I was rather thirsty (from all this talking,
+probably).">)
+                (T
+                 <TELL
+"I'd like to, but I can't get to it.">)>
+          <PUT .PRSOBJ ,OCAN <>>
+          <PUT .NOBJ ,OCONTENTS <SPLICE-OUT .PRSOBJ <OCONTENTS .NOBJ>>>)
+         (<NOT <OR .EAT? .DRINK?>>
+          <TELL
+"I don't think that the " 1 <ODESC2 .PRSOBJ> " would agree with you.">)
+         (<TELL
+"I think you should get that first.">)>>
+
+<DEFINE JARGON ()
+    <TELL "Well, FOO, BAR, and BLETCH to you too!">>
+
+<DEFINE CURSES ()
+    <TELL <PICK-ONE ,OFFENDED>>>
+
+<PSETG OFFENDED 
+  '["Such language in a high-class establishment like this!"
+    "You ought to be ashamed of yourself."
+    "Its not so bad.  You could have been killed already."
+    "Tough shit, asshole."
+    "Oh, dear.  Such language from a supposed winning adventurer!"]>
+
+<GDECL (OFFENDED) <VECTOR [REST STRING]>>
+
+"ROBBER"
+
+<DEFINE ROBBER ROBBER (HACK
+                      "AUX" (RM <HROOM .HACK>) ROBJ
+                            (SEEN? <RSEEN? .RM>) (WIN ,WINNER) (WROOM ,HERE)
+                            (HOBJ <HOBJ .HACK>) (STILL <FIND-OBJ "STILL">) 
+                            HERE? (HH <HOBJS .HACK>) (TREAS <FIND-ROOM "TREAS">))
+   #DECL ((HACK) HACK (RM WROOM) ROOM (ROBJ HH) <LIST [REST OBJECT]>
+         (SEEN?) <OR ATOM FALSE> (WIN) ADV (HOBJ) OBJECT (ROBBER) ACTIVATION
+         (HERE?) <OR ROOM FALSE> (STILL) OBJECT (TREAS) ROOM)
+   <PROG ((ONCE <>) OBJT)
+     #DECL ((ONCE) <OR ATOM FALSE> (OBJT) <LIST [REST OBJECT]>)
+     <COND (<SET HERE? <OROOM .HOBJ>>
+           <SET RM .HERE?>)>
+     <SET ROBJ <ROBJS .RM>>
+     <SET OBJT .HH>
+     <COND
+      (<AND <==? .RM .TREAS>
+           <N==? .RM .WROOM>>
+       <COND (.HERE?
+             <COND (<==? <OROOM .STILL> .TREAS>
+                    <SNARF-OBJECT .HOBJ .STILL>)>
+             <REMOVE-OBJECT .HOBJ>
+             <SET HERE? <>>)>
+       <MAPF <>
+            <FUNCTION (X) 
+                    #DECL ((X) OBJECT)
+                    <COND (<G? <OTVAL .X> 0>
+                           <PUT .HACK ,HOBJS <SET HH <SPLICE-OUT .X .HH>>>
+                           <INSERT-OBJECT .X .RM>)>>
+            .HH>)
+      (<==? .RM .WROOM>                 ;"Adventurer is in room:  CHOMP, CHOMP"
+       <COND
+       (<==? .RM .TREAS>)      ; "Don't move, Gertrude"
+        (<NOT <HFLAG .HACK>>
+         <COND (<AND <NOT .HERE?> <PROB 30>>
+               <COND (<==? <OCAN .STILL> .HOBJ>
+                      <INSERT-OBJECT .HOBJ .RM>
+                      <TELL 
+"Someone carrying a large bag is casually leaning against one of the
+walls here.  He does not speak, but it is clear from his aspect that
+the bag will be taken only over his dead body.">
+                      <PUT .HACK ,HFLAG T>
+                      <RETURN T .ROBBER>)>)
+              (<AND .HERE?
+                    <FIGHTING? .HOBJ>
+                    <COND (<NOT <WINNING? .HOBJ .WIN>>
+                           <TELL
+"Your opponent, determining discretion to be the better part of
+valor, decides to terminate this little contretemps.  With a rueful
+nod of his head, he steps backward into the gloom and disappears.">
+                           <REMOVE-OBJECT .HOBJ>
+                           <TRZ .HOBJ ,FIGHTING>
+                           <SNARF-OBJECT .HOBJ .STILL>
+                           <RETURN T .ROBBER>)
+                          (<PROB 90>)>>)
+              (<AND .HERE? <PROB 30>>
+               <TELL 
+
+"The holder of the large bag just left, looking disgusted. 
+Fortunately, he took nothing.">
+               <REMOVE-OBJECT .HOBJ>
+               <SNARF-OBJECT .HOBJ .STILL>
+               <RETURN T .ROBBER>)
+              (<PROB 70> <RETURN T .ROBBER>)
+              (T
+               <COND (<MEMQ .STILL <HOBJS .HACK>>
+                      <PUT .HACK ,HOBJS <SPLICE-OUT .STILL <HOBJS .HACK>>>
+                      <PUT .HOBJ ,OCONTENTS (.STILL)>
+                      <PUT .STILL ,OCAN .HOBJ>)>
+               <PUT .HACK ,HOBJS <SET HH <ROB-ROOM .RM .HH 100>>>
+               <PUT .HACK ,HOBJS <SET HH <ROB-ADV .WIN .HH>>>
+               <PUT .HACK ,HFLAG T>
+               <COND (<AND <N==? .OBJT .HH> <NOT .HERE?>>
+                      <TELL 
+"A seedy-looking individual with a large bag just wandered through
+the room.  On the way through, he quietly abstracted all valuables
+from the room and from your possession, mumbling something about
+\"Doing unto others before..\"">)
+                     (.HERE?
+                      <SNARF-OBJECT .HOBJ .STILL>
+                      <COND (<N==? .OBJT .HH>
+                             <TELL 
+"The other occupant just left, still carrying his large bag.  You may
+not have noticed that he robbed you blind first.">)
+                            (<TELL 
+"The other occupant (he of the large bag), finding nothing of value,
+left disgusted.">)>
+                      <REMOVE-OBJECT .HOBJ>
+                      <SET HERE? <>>)
+                     (T
+                      <TELL 
+
+"A 'lean and hungry' gentleman just wandered through.  Finding
+nothing of value, he left disgruntled.">)>)>)
+       (T
+        <COND (.HERE?                  ;"Here, already announced."
+               <COND (<PROB 30>
+                      <PUT .HACK ,HOBJS <SET HH <ROB-ROOM .RM .HH 100>>>
+                      <PUT .HACK ,HOBJS <SET HH <ROB-ADV .WIN .HH>>>
+                      <COND (<MEMQ <FIND-OBJ "ROPE"> .HH>
+                             <SETG DOME-FLAG!-FLAG <>>)>
+                      <COND (<==? .OBJT .HH>
+                             <TELL
+"The other occupant (he of the large bag), finding nothing of value,
+left disgusted.">)
+                            (T
+                             <TELL
+"The other occupant just left, still carrying his large bag.  You may
+not have noticed that he robbed you blind first.">)>
+                      <REMOVE-OBJECT .HOBJ>
+                      <SET HERE? <>>
+                      <SNARF-OBJECT .HOBJ .STILL>)
+                     (<RETURN T .ROBBER>)>)>)>)
+      (<AND <MEMQ .HOBJ <ROBJS .RM>>   ;"Leave if victim left"
+           <SNARF-OBJECT .HOBJ .STILL>
+           <REMOVE-OBJECT .HOBJ>
+           <SET HERE? <>>>)
+      (<AND <==? <OROOM .STILL> .RM>
+           <SNARF-OBJECT .HOBJ .STILL>
+           <>>)
+      (.SEEN?                               ;"Hack the adventurer's belongings"
+       <PUT .HACK ,HOBJS <SET HH <ROB-ROOM .RM .HH 75>>>
+       <COND
+       (<AND <==? <RDESC2 .RM> ,MAZEDESC> <==? <RDESC2 .WROOM> ,MAZEDESC>>
+        <MAPF <>
+              <FUNCTION (X) 
+                      #DECL ((X) OBJECT)
+                      <COND (<AND <CAN-TAKE? .X> <OVIS? .X> <PROB 40>>
+                             <TELL 
+"You hear, off in the distance, someone saying \"My, I wonder what
+this fine "                  3 <ODESC2 .X> " is doing here.\"">
+                             <TELL "" 1>
+                             <COND (<PROB 60>
+                                    <REMOVE-OBJECT .X>
+                                    <PUT .X ,OTOUCH? T>
+                                    <PUT .HACK ,HOBJS <SET HH (.X !.HH)>>)>
+                             <MAPLEAVE>)>>
+              <ROBJS .RM>>)
+       (<MAPF <>
+              <FUNCTION (X) 
+                      #DECL ((X) OBJECT)
+                      <COND (<AND <0? <OTVAL .X>> <CAN-TAKE? .X> <OVIS? .X> <PROB 20>>
+                             <REMOVE-OBJECT .X>
+                             <PUT .X ,OTOUCH? T>
+                             <PUT .HACK ,HOBJS <SET HH (.X !.HH)>>
+                             <COND (<==? .RM .WROOM>
+                                    <TELL "You suddenly notice that the "
+                                          1
+                                          <ODESC2 .X>
+                                          " vanished.">)>
+                             <MAPLEAVE>)>>
+              <ROBJS .RM>>
+        <COND (<MEMQ <FIND-OBJ "ROPE"> .HH>
+               <SETG DOME-FLAG!-FLAG <>>)>)>)>
+     <COND (<SET ONCE <NOT .ONCE>>              ;"Move to next room, and hack."
+           <PROG ((ROOMS <HROOMS .HACK>))
+             <SET RM <1 .ROOMS>>
+             <COND (<EMPTY? <SET ROOMS <REST .ROOMS>>>
+                    <SET ROOMS ,ROOMS>)>
+             <COND (<RTRNN .RM ,RSACREDBIT>    ;"Can I work here?"
+                    <AGAIN>)>
+             <PUT .HACK ,HROOM .RM>
+             <PUT .HACK ,HFLAG <>>
+             <PUT .HACK ,HROOMS .ROOMS>
+             <SET SEEN? <RSEEN? .RM>>>
+           <AGAIN>)>>                        ;"Drop worthless cruft, sometimes"
+   <OR <==? .RM .TREAS>
+       <MAPF <>
+            <FUNCTION (X) 
+                    #DECL ((X) OBJECT)
+                    <COND (<AND <0? <OTVAL .X>> <PROB 30>>
+                           <PUT .HACK ,HOBJS <SET HH <SPLICE-OUT .X .HH>>>
+                           <INSERT-OBJECT .X .RM>
+                           <AND <==? .RM .WROOM>
+                                <TELL 
+"The robber, rummaging through his bag, dropped a few items he found
+valueless." >>)>>
+             .HH>>>
+
+<DEFINE SNARF-OBJECT (WHO WHAT)
+       #DECL ((WHO WHAT) OBJECT)
+       <COND (<AND <N==? <OCAN .WHAT> .WHO>
+                   <OR <OROOM .WHAT>
+                       <OCAN .WHAT>>>
+              <REMOVE-OBJECT .WHAT>
+              <PUT .WHAT ,OCAN .WHO>
+              <PUT .WHO ,OCONTENTS (.WHAT !<OCONTENTS .WHO>)>)
+             (.WHO)>>
+
+<DEFINE ROBBER-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>)
+                        (DEM <GET-DEMON "THIEF">) (PV ,PRSVEC)
+                        (PRSOBJ <2 .PV>) (HERE ,HERE) (FLG <>)
+                        BRICK FUSE ST F (T <HOBJ .DEM>) (CHALI <FIND-OBJ "CHALI">))
+  #DECL ((PV) VECTOR (DEM) HACK (PRSACT) VERB (PRSOBJ) <OR OBJECT FALSE>
+        (CHALI T HOBJ ST BRICK FUSE) OBJECT (F) <VECTOR ANY CEVENT> (HERE) ROOM
+        (FLG) <OR ATOM FALSE>)
+  <COND (<==? .PRSACT ,FIGHT!-WORDS>
+        <COND (<==? <OCAN <SET ST <FIND-OBJ "STILL">>> .T> <>)
+              (<==? <OROOM .ST> .HERE>
+               <SNARF-OBJECT .T .ST>
+               <TELL
+"The robber, somewhat surprised at this turn of events, nimbly
+retrieves his stilletto.">
+               T)
+              (ELSE
+               <TELL
+"Annoyed to be left unarmed in such an obviously dangerous
+neighborhood, the thief slips off into the shadows.">
+               <TRO .CHALI ,TAKEBIT>
+               <REMOVE-OBJECT .T>)>)
+       (<==? .PRSACT ,DEAD\!!-WORDS>
+        <COND (<NOT <EMPTY? <HOBJS .DEM>>>
+               <TELL "  His booty remains.">
+               <MAPF <> <FUNCTION (X) #DECL ((X) OBJECT)
+                                  <INSERT-OBJECT .X .HERE>
+                                  <TRO .X ,ECHO-ROOM-BIT>>
+                     <HOBJS .DEM>>
+               <PUT .DEM ,HOBJS ()>)>
+        <TRO .CHALI ,TAKEBIT>
+        <COND (<==? .HERE <FIND-ROOM "TREAS">>
+               <MAPF <>
+                 <FUNCTION (X) #DECL ((X) OBJECT)
+                   <COND (<AND <N==? .X .CHALI>
+                               <N==? .X .T>>
+                          <COND (<TRNN .X ,ECHO-ROOM-BIT>
+                                 <TRZ .X ,ECHO-ROOM-BIT>)
+                                (<TRO .X ,OVISON>
+                                 <COND (<NOT .FLG>
+                                        <SET FLG T>
+                                        <TELL
+"As the thief dies, the power of his magic decreases, and his
+treasures reappear:" 2>)>
+                                 <TELL "  A " 2 <ODESC2 .X>>)>)>>
+                 <ROBJS .HERE>>)>
+        <PUT .DEM ,HACTION <>>)
+       (<==? .PRSACT ,FIRST?!-WORDS> <PROB 20>)
+       (<==? .PRSACT ,OUT\!!-WORDS>
+        <PUT .DEM ,HACTION <>>
+        <TRZ <FIND-OBJ "STILL"> ,OVISON>
+        <TRO .CHALI ,TAKEBIT>
+        <PUT .T ,ODESC1 ,ROBBER-U-DESC>)
+       (<==? .PRSACT ,IN\!!-WORDS>
+        <COND (<==? <HROOM .DEM> .HERE>
+               <TELL
+"The robber revives, briefly feigning continued unconsciousness, and
+when he sees his moment, scrambles away from you.">)>
+        <COND (<TYPE? ,ROBBER OFFSET> <PUT .DEM ,HACTION ROBBER>)
+              (<PUT .DEM ,HACTION ROBBER>)>
+        <PUT .T ,ODESC1 ,ROBBER-C-DESC>
+        <COND (<AND <==? .HERE <FIND-ROOM "TREAS">>
+                    <OROOM <SET CHALI .CHALI>>>
+               <TRZ .CHALI ,TAKEBIT>)>
+        <TRO <FIND-OBJ "STILL"> ,OVISON>)
+       (<AND <TYPE? .PRSOBJ OBJECT>
+             <==? <2 .PV> ,KNIFE!-OBJECTS>
+             <==? <VNAME .PRSACT> THROW!-WORDS>
+             <NOT <TRNN .T ,FIGHTBIT>>>
+        <COND (<PROB 10>
+               <TELL
+"You evidently frightened the robber, though you didn't hit him.  He
+flees"          1
+                <COND (<EMPTY? <HOBJS .DEM>>
+                       ".")
+                      (T
+                       <MAPF <> <FUNCTION (X) #DECL ((X) OBJECT)
+                                          <INSERT-OBJECT .X .HERE>> <HOBJS .DEM>>
+                       <PUT .DEM ,HOBJS ()>
+                       ", but the contents of his bag fall on the floor.")>>
+               <REMOVE-OBJECT .T>)
+              (T
+               <TELL
+"You missed.  The thief makes no attempt to take the knife, though it
+would be a fine addition to the collection in his bag.  He does seem
+angered by your attempt.">
+               <TRO .T ,FIGHTBIT>)>)
+       (<AND <OR <==? .PRSACT ,THROW!-WORDS>
+                 <==? .PRSACT ,GIVE!-WORDS>>
+             <TYPE? .PRSOBJ OBJECT>
+             <N==? .PRSOBJ <HOBJ .DEM>>>
+        <COND (<L? <OCAPAC .T> 0>
+               <PUT .T ,OCAPAC <- <OCAPAC .T>>>
+               <PUT .DEM ,HACTION <COND (<TYPE? ,ROBBER OFFSET> ,ROBBER)
+                                        (ROBBER)>>
+               <TRO <FIND-OBJ "STILL"> ,OVISON>
+               <PUT .T ,ODESC1 ,ROBBER-C-DESC>
+               <TELL
+"Your proposed victim suddenly recovers consciousness.">)>
+        <COND (<AND <==? .PRSOBJ <SET BRICK <FIND-OBJ "BRICK">>>
+                    <==? <OCAN <SET FUSE <FIND-OBJ "FUSE">>> .BRICK>
+                    <ORAND .FUSE>
+                    <NOT <0? <CTICK <2 <SET F <ORAND .FUSE>>>>>>>
+               ; "I.e., he's trying to give us the brick with a lighted fuse."
+               <TELL 
+"The thief seems rather offended by your offer.  Do you think he's as
+stupid as you are?">)
+              (<REMOVE-OBJECT .PRSOBJ>
+               <PUT .DEM ,HOBJS (.PRSOBJ !<HOBJS .DEM>)>
+               <TELL
+"The thief places the " 1 <ODESC2 .PRSOBJ> " in his bag and thanks
+you politely.">)>)
+       (<AND .PRSACT <==? <VNAME .PRSACT> TAKE!-WORDS>>
+        <TELL
+"Once you got him, what would you do with him?">)>>
+
+<DEFINE CHALICE ("AUX" (PRSA <1 ,PRSVEC>) (CH <2 ,PRSVEC>) TR T)
+       #DECL ((PRSA) VERB (CH) OBJECT (TR) ROOM (T) OBJECT)
+       <COND (<==? .PRSA ,TAKE!-WORDS>
+              <COND (<AND <NOT <OCAN .CH>>
+                          <==? <OROOM .CH> <SET TR <FIND-ROOM "TREAS">>>
+                          <==? <OROOM <SET T <FIND-OBJ "THIEF">>> .TR>
+                          <FIGHTING? .T>
+                          <HACTION ,ROBBER-DEMON>>
+                     <TELL
+"Realizing just in time that you'd be stabbed in the back if you
+attempted to take the chalice, you return to the fray.">)>)>>
+
+\f
+
+<DEFINE BURNER ("AUX" (PV ,PRSVEC) (PRSO <2 .PV>) (PRSI <3 .PV>))
+     #DECL ((PV) VECTOR (PRSO PRSI) OBJECT)
+     <COND (<FLAMING? .PRSI>
+           <COND (<OBJECT-ACTION>)
+                 (<AND <==? <AVEHICLE ,WINNER> <FIND-OBJ "BALLO">>
+                       <BALLOON>>)
+                 (<AND <BURNABLE? .PRSO>
+                       <COND (<MEMQ .PRSO <AOBJS ,WINNER>>
+                              <TELL
+"The " 1 <ODESC2 .PRSO> " catches fire.">
+                              <JIGS-UP 
+"Unfortunately, you were holding it at the time.">)
+                             (<HACKABLE? .PRSO ,HERE>
+                              <TELL
+"The " 1 <ODESC2 .PRSO> " catches fire and is consumed.">
+                              <REMOVE-OBJECT .PRSO>)
+                             (<TELL "You don't have that.">)>>)
+                 (<TELL 
+"I don't think you can burn a " 1 <ODESC2 .PRSO> ".">)>)
+          (<TELL
+"With a " 1 <ODESC2 .PRSI> "??!?">)>>  
+
+<DEFINE TURNER ("AUX" (PV ,PRSVEC) (PRSO <2 .PV>) (PRSI <3 .PV>))
+    #DECL ((PV) VECTOR (PRSO PRSI) OBJECT)
+    <COND (<TRNN .PRSO ,TURNBIT>
+          <COND (<TRNN .PRSI ,TOOLBIT>
+                 <OBJECT-ACTION>)
+                (<TELL
+"You certainly can't turn it with a " 1 <ODESC2 .PRSI> ".">)>)
+         (<TELL
+"You can't turn that!">)>>
+
+<PSETG DOORMUNGS
+  '["The door is invulnerable."
+    "You cannot damage this door."
+    "The door is still under warranty."]>
+
+<GDECL (DOORMUNGS) <VECTOR [REST STRING]>>
+
+<DEFINE DDOOR-FUNCTION ("AUX" (PA <1 ,PRSVEC>))
+    #DECL ((PA) VERB)
+    <COND (<==? .PA ,OPEN!-WORDS>
+          <TELL
+"The door cannot be opened.">)
+         (<==? .PA ,BURN!-WORDS>
+          <TELL
+"You cannot burn this door.">)
+         (<==? .PA ,MUNG!-WORDS>
+          <TELL <PICK-ONE ,DOORMUNGS>>)>>
+
+ <DEFINE INFLATER ("AUX" (PRSI <2 ,PRSVEC>) (PRSO <3 ,PRSVEC>))
+    #DECL ((PRSI PRSO) OBJECT)
+    <COND (<==? .PRSI <FIND-OBJ "IBOAT">>
+          <COND (<==? .PRSO <FIND-OBJ "PUMP">>
+                 <OBJECT-ACTION>)
+                (<TELL "You would inflate it with that?">)>)
+         (<==? .PRSI <FIND-OBJ "RBOAT">>
+          <TELL "Inflating it further would probably burst it.">)
+         (<TELL "How can you inflate that?">)>>
+
+<DEFINE DEFLATER ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <COND (<==? .PRSO <FIND-OBJ "RBOAT">>
+          <OBJECT-ACTION>)
+         (<TELL "Come on, now!">)>>
+
+<DEFINE LOCKER ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <COND (<==? .PRSO <FIND-OBJ "GRAT2">>
+          <SETG GRUNLOCK!-FLAG <>>
+          <TELL "The grate is locked.">
+          <MAPF <>
+                <FUNCTION (X)
+                          #DECL ((X) <OR CEXIT NEXIT ROOM>)
+                          <COND (<AND <TYPE? .X CEXIT>
+                                      <==? <CXFLAG .X> KEY-FLAG!-FLAG>>
+                                 <PUT .X ,CXSTR "The grate is locked.">
+                                 <MAPLEAVE>)>>
+                <REXITS ,HERE>>)
+         (<TELL "It doesn't seem to work.">)>>
+
+<DEFINE UNLOCKER ("AUX" (PRSO <2 ,PRSVEC>) (PRSI <3 ,PRSVEC>) (R <FIND-ROOM "MGRAT">))
+    #DECL ((PRSO PRSI) OBJECT (R) ROOM)
+    <COND (<==? .PRSO <FIND-OBJ "GRAT2">>
+          <COND (<==? .PRSI <FIND-OBJ "KEYS">>
+                 <SETG GRUNLOCK!-FLAG T>
+                 <TELL "The grate is unlocked.">
+                 <MAPF <>
+                       <FUNCTION (X)
+                         #DECL ((X) <OR CEXIT NEXIT ROOM>)
+                         <COND (<AND <TYPE? .X CEXIT>
+                                     <==? <CXFLAG .X> KEY-FLAG!-FLAG>>
+                                <PUT .X ,CXSTR "The grate is closed.">
+                                <MAPLEAVE>)>>
+                       <REXITS .R>>)
+                (<TELL "Can you unlock a grating with a " 1 <ODESC2 .PRSI> "?">)>)
+         (<TELL "It doesn't seem to work.">)>>
+
+<DEFINE KILLER ("AUX" (PV ,PRSVEC) (PRSO <2 .PV>) (PRSI <3 .PV>))
+       #DECL ((PV) VECTOR (PRSO PRSI) <OR FALSE OBJECT>)
+       <COND (<NOT .PRSO>
+              <TELL "There is nothing here to kill.">)
+             (<NOT .PRSI>
+              <TELL "Trying to kill a " 1 <ODESC2 .PRSO>
+                    " with your bare hands is suicidal.">)
+             (<NOT <TRNN .PRSI ,WEAPONBIT>>
+              <TELL "Trying to kill a " 0 <ODESC2 .PRSO>
+                    " with a ">
+              <TELL <ODESC2 .PRSI> 1 " is suicidal.">) 
+             (ELSE
+              <BLOW ,PLAYER .PRSO <ORAND .PRSI> T <>>)>>
+
+<DEFINE ATTACKER ("AUX" (PV ,PRSVEC) (PRSO <2 .PV>) (PRSI <3 .PV>))
+       #DECL ((PV) VECTOR (PRSO PRSI) <OR FALSE OBJECT>)
+       <COND (<NOT .PRSO>
+              <TELL "There is nothing here to attack.">)
+             (<NOT .PRSI>
+              <TELL "Attacking a " 1 <ODESC2 .PRSO>
+                    " with your bare hands is suicidal.">)
+             (<NOT <TRNN .PRSI ,WEAPONBIT>>
+              <TELL "Attacking a " 0 <ODESC2 .PRSO>
+                     " with a ">
+              <TELL <ODESC2 .PRSI> 1 " is suicidal.">)
+             (ELSE
+              <BLOW ,PLAYER .PRSO <ORAND .PRSI> T <>>)>>
+
+<DEFINE SWINGER ("AUX" (PV ,PRSVEC) (PRSO <2 .PV>) (PRSI <3 .PV>))
+       #DECL ((PV) VECTOR (PRSO PRSI) <OR FALSE OBJECT>) 
+       <PUT .PV 2 .PRSI>
+       <PUT .PV 3 .PRSO>
+       <ATTACKER>>
+
+<DEFINE HACK-HACK (OBJ STR "OPTIONAL" (OBJ2 <>))
+    #DECL ((OBJ) OBJECT (STR) STRING (OBJ2) <OR FALSE STRING>)
+    <COND (<OBJECT-ACTION>)
+         (.OBJ2
+          <TELL .STR 0 <ODESC2 .OBJ> " with a ">
+          <TELL .OBJ2 1 <PICK-ONE ,HO-HUM>>)
+         (ELSE
+          <TELL .STR 1 <ODESC2 .OBJ> <PICK-ONE ,HO-HUM>>)>>
+
+<PSETG HO-HUM
+ '[" does not seem to do anything."
+   " is not notably useful."
+   " isn't very interesting."
+   " doesn't appear worthwhile."
+   " has no effect."
+   " doesn't do anything."]>
+
+<GDECL (HO-HUM) <VECTOR [REST STRING]>>
+
+<DEFINE MUNGER ("AUX" (PRSO <2 ,PRSVEC>) (PRSW <3 ,PRSVEC>))
+    #DECL ((PRSW) <OR OBJECT FALSE> (PRSO) OBJECT)
+    <COND (<TRNN .PRSO ,VILLAIN>
+          <COND (.PRSW
+                 <COND (<TRNN .PRSW ,WEAPONBIT>
+                        <BLOW ,PLAYER .PRSO <ORAND .PRSW> T <>>)
+                       (T
+                        <TELL "Munging a " 0 <ODESC2 .PRSO> " with a ">
+                        <TELL <ODESC2 .PRSW> 1 " is quite self-destructive.">)>)
+                (T
+                 <TELL "Munging a " 1 <ODESC2 .PRSO> " with your bare hands is suicidal.">)>)
+         (<HACK-HACK .PRSO "Munging a ">)>>
+
+<DEFINE KICKER ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <HACK-HACK .PRSO "Munging a ">>
+
+<DEFINE WAVER ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <HACK-HACK .PRSO "Waving a ">>
+
+<DEFINE R/L ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <HACK-HACK .PRSO "Playing in this way with a ">>
+
+<DEFINE RUBBER ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <HACK-HACK .PRSO "Fiddling with a ">>
+
+<DEFINE EXORCISE ()
+    <COND (<OBJECT-ACTION>) (T)>>
+         
+<DEFINE PLUGGER ()
+    <COND (<OBJECT-ACTION>)
+         (<TELL "This has no effect.">)>>
+
+<DEFINE UNTIE ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <COND (<OBJECT-ACTION>)
+         (<TRNN .PRSO ,TIEBIT>
+          <TELL "I don't think so.">)
+         (<TELL "This cannot be tied, so it cannot be untied!">)>>
+
+<DEFINE PUSHER ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <COND (<OBJECT-ACTION>)
+         (<MEMQ BUTTO!-OBJECTS <ONAMES .PRSO>>)
+         (<HACK-HACK .PRSO "Pushing the ">)>>
+
+<DEFINE TIE ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <COND (<TRNN .PRSO ,TIEBIT>
+          <COND (<OBJECT-ACTION>)
+                (<TELL "You can't tie it to that.">)>)
+         (<TELL "How can you tie that to anything.">)>>
+
+<DEFINE MELTER ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <COND (<OBJECT-ACTION>)
+         (<TELL "I'm not sure that a " 1 <ODESC2 .PRSO> " can be melted.">)>>
+
+<SETG ON-POLE!-FLAG <>>
+
+<DEFINE BODY-FUNCTION ("AUX" (PRSA <1 ,PRSVEC>))
+    #DECL ((PRSA) VERB)
+    <COND (<==? .PRSA ,TAKE!-WORDS>
+          <TELL "A force keeps you from taking the bodies.">)
+         (<OR <==? .PRSA ,MUNG!-WORDS>
+              <==? .PRSA ,BURN!-WORDS>>
+          <COND (,ON-POLE!-FLAG)
+                (<SETG ON-POLE!-FLAG T>
+                 <INSERT-OBJECT <FIND-OBJ "HPOLE"> <FIND-ROOM "LLD2">>)>
+          <JIGS-UP 
+"The voice of the guardian of the dungeon booms out from the darkness 
+'Your disrespect costs you your life!' and places your head on a pole.">)>>
+
+<DEFINE MUMBLER ()
+    <TELL "You'll have to speak up if you expect me to hear you!">>
+
+<DEFINE ALARM ("AUX" (PRSO <2 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT)
+    <COND (<TRNN .PRSO ,SLEEPBIT>
+          <OBJECT-ACTION>)
+         (<TELL "The " 1 <ODESC2 .PRSO> " isn't sleeping.">)>>
+
+<DEFINE ZORK ()
+    <TELL "That word is replaced henceforth with DUNGEON.">>
+
+<DEFINE DUNGEON ()
+    <TELL "At your service!">>
+
+<DEFINE PAINTING ("AUX" (PRSA <1 ,PRSVEC>) (ART <2 ,PRSVEC>))
+    #DECL ((PRSA) VERB (ART) OBJECT)
+    <COND (<==? .PRSA ,MUNG!-WORDS>
+          <PUT .ART ,OTVAL 0>
+          <PUT .ART ,ODESC2 "worthless piece of canvas">
+          <PUT .ART ,ODESC1 "There is a worthless piece of canvas here.">
+          <TELL
+"Congratulations!  Unlike the other vandals, who merely stole the
+artist's masterpieces, you have destroyed one.">)>>
+
+<PSETG DIMMER "The lamp appears to be getting dimmer.">
+
+<PSETG LAMP-TICKS [50 30 20 10 4 0]>
+
+<PSETG LAMP-TELLS [,DIMMER ,DIMMER ,DIMMER ,DIMMER "The lamp is dying."]>
+
+<DEFINE LANTERN ("AUX" (PV ,PRSVEC) (VERB <1 .PV>) (HERE ,HERE)
+                      (RLAMP <FIND-OBJ "LAMP">) FOO)
+       #DECL ((PV) VECTOR (VERB) VERB (HERE) ROOM (RLAMP) OBJECT
+              (FOO) <VECTOR ANY CEVENT>)
+       <COND (<==? .VERB ,THROW!-WORDS>
+              <TELL 
+"The lamp has smashed into the floor and the light has gone out.">
+              <REMOVE-OBJECT <FIND-OBJ "LAMP">>
+              <INSERT-OBJECT <FIND-OBJ "BLAMP"> .HERE>)
+             (<==? .VERB ,C-INT!-WORDS>
+              <LIGHT-INT .RLAMP ,LNTIN ,LAMP-TICKS ,LAMP-TELLS>)
+             (<==? .VERB ,TURN-ON!-WORDS>
+              <CLOCK-ENABLE <2 <SET FOO <ORAND .RLAMP>>>>
+              <>)
+             (<==? .VERB ,TURN-OFF!-WORDS>
+              <CLOCK-DISABLE <2 <SET FOO <ORAND .RLAMP>>>>
+              <>)>>
+
+<DEFINE SWORD-GLOW (DEM
+                   "AUX" (SW <HOBJ .DEM>) (G <OTVAL .SW>) (HERE ,HERE) (NG 0))
+   #DECL ((DEM) HACK (SW) OBJECT (NG G) FIX (HERE) ROOM)
+   <COND (<AND <NOT <OROOM .SW>> <NOT <OCAN .SW>>
+              <MEMQ .SW <AOBJS ,PLAYER>>>
+         <COND (<INFESTED? .HERE> <SET NG 2>)
+               (<MAPF <>
+                      <FUNCTION (E) 
+                                #DECL ((E) <OR ROOM CEXIT NEXIT ATOM>)
+                                <COND (<TYPE? .E ROOM>
+                                       <AND <INFESTED? .E> <MAPLEAVE T>>)
+                                      (<TYPE? .E CEXIT>
+                                       <AND <INFESTED? <2 .E>> <MAPLEAVE T>>)>>
+                      <REXITS .HERE>>
+                <SET NG 1>)>
+         <COND (<==? .NG .G>)
+               (<==? .NG 2> <TELL "Your sword has begun to glow very brightly.">)
+               (<1? .NG> <TELL "Your sword is glowing with a faint blue glow.">)
+               (<0? .NG> <TELL "Your sword is no longer glowing.">)>
+         <PUT .SW ,OTVAL .NG>)
+        (<PUT .DEM ,HACTION <>>)>>
+
+<DEFINE SWORD ("AUX" (PA <1 ,PRSVEC>))
+       #DECL ((PA) VERB)
+       <COND (<AND <==? .PA ,TAKE!-WORDS>
+                   <==? ,WINNER ,PLAYER>>
+              <PUT ,SWORD-DEMON ,HACTION <COND (<TYPE? ,SWORD-GLOW OFFSET>
+                                                ,SWORD-GLOW)
+                                               (SWORD-GLOW)>>
+              <>)>>
+
+<DEFINE INFESTED? (R "AUX" (VILLAINS ,VILLAINS) (DEM <GET-DEMON "THIEF">)) 
+       #DECL ((R) ROOM (VILLAINS) <LIST [REST OBJECT]> (DEM) HACK)
+       <OR <AND <==? .R <HROOM .DEM>>
+                <HACTION .DEM>>
+           <MAPF <>
+                 <FUNCTION (V) 
+                         #DECL ((V) OBJECT)
+                         <COND (<==? .R <OROOM .V>> <MAPLEAVE T>)>>
+                 .VILLAINS>>>
+
+
+<PSETG CDIMMER "The candles grow shorter.">
+
+<PSETG CANDLE-TICKS [20 10 5 0]>
+
+<PSETG CANDLE-TELLS [,CDIMMER ,CDIMMER "The candles are very short."]>
+
+<DEFINE MATCH-FUNCTION ("AUX" (PRSA <1 ,PRSVEC>) (PRSO <2 ,PRSVEC>)
+                       (MATCH <FIND-OBJ "MATCH">) (MC <ORAND .MATCH>))
+    #DECL ((PRSA) VERB (MATCH) OBJECT (MC) FIX)
+    <COND (<AND <==? .PRSA ,LIGHT!-WORDS> <==? .PRSO .MATCH>>
+          <COND (<AND <PUT .MATCH ,ORAND <SET MC <- .MC 1>>>
+                      <L=? .MC 0>>
+                 <TELL "I'm afraid that you have run out of matches.">)
+                (<TRO .MATCH ,FLAMEBIT>
+                 <PUT .MATCH ,OLIGHT? 1>
+                 <CLOCK-INT ,MATIN 2>
+                 <TELL "One of the matches starts to burn.">)>)
+         (<AND <==? .PRSA ,TURN-OFF!-WORDS> <1? <OLIGHT? .MATCH>>>
+          <TELL "The match is out.">
+          <TRZ .MATCH ,FLAMEBIT>
+          <PUT .MATCH ,OLIGHT? 0>
+          <CLOCK-INT ,MATIN 0>
+          T)
+         (<==? .PRSA ,C-INT!-WORDS>
+          <TELL "The match has gone out.">
+          <TRZ .MATCH ,FLAMEBIT>
+          <PUT .MATCH ,OLIGHT? 0>)>>
+
+<DEFINE CANDLES ("AUX" (PRSACT <1 ,PRSVEC>) (C <FIND-OBJ "CANDL">)
+                      (WINNER ,WINNER) (AO <AOBJS .WINNER>) (W <3 ,PRSVEC>)
+                      MATCH FOO ORPHANS)
+       #DECL ((PRSACT) VERB (MATCH C) OBJECT (W) <OR FALSE OBJECT> (WINNER) ADV
+              (AO) <LIST [REST OBJECT]> (FOO) <VECTOR FIX CEVENT>
+              (ORPHANS) <VECTOR [4 ANY]>)
+       <OR <ORAND .C> <PUT .C ,ORAND [0 <CLOCK-INT ,CNDIN 50>]>>
+       <SET FOO <ORAND .C>>
+       <COND (<==? .PRSACT ,LIGHT!-WORDS>
+              <COND (<0? <OLIGHT? .C>>
+                     <TELL 
+"Alas, there's not much left of the candles.  Certainly not enough to
+burn.">)
+                    (<NOT .W>
+                     <TELL "With what?">
+                     <PUT <SET ORPHANS ,ORPHANS>
+                          ,OFLAG T>
+                     <PUT .ORPHANS ,OACTION .PRSACT>
+                     <PUT .ORPHANS ,OSLOT1 .C>
+                     <PUT .ORPHANS ,OPREP <CHTYPE WITH!-WORDS PREP>>
+                     <SETG PARSE-WON <>>
+                     T)
+                    (<AND <==? .W <SET MATCH <FIND-OBJ "MATCH">>>
+                          <1? <OLIGHT? .MATCH>>>
+                     <COND (<1? <OLIGHT? .C>>
+                            <TELL "The candles are already lighted.">)
+                           (<PUT .C ,OLIGHT? 1>
+                            <TELL "The candles are lighted.">
+                            <CLOCK-ENABLE <2 .FOO>>)>)
+                    (<==? .W <FIND-OBJ "TORCH">>
+                     <COND (<1? <OLIGHT? .C>>
+                            <TELL 
+"You realize, just in time, that the candles are already lighted.">)
+                           (<TELL 
+"The heat from the torch is so intense that the candles are vaporised.">
+                            <COND (<OR <OROOM .C> <OCAN .C>>
+                                   <REMOVE-OBJECT .C>)
+                                  (<PUT .WINNER ,AOBJS <SPLICE-OUT .C .AO>>)>)>)
+                    (<TELL
+"You have to light them with something that's burning, you know.">)>)
+             (<==? .PRSACT ,TURN-OFF!-WORDS>
+              <CLOCK-DISABLE <2 .FOO>>
+              <COND (<1? <OLIGHT? .C>>
+                     <TELL "The flame is extinguished.">
+                     <PUT .C ,OLIGHT? -1>)
+                    (<TELL "The candles are not lighted.">)>)
+             (<==? .PRSACT ,C-INT!-WORDS>
+              <LIGHT-INT .C ,CNDIN ,CANDLE-TICKS ,CANDLE-TELLS>)>>
+
+<DEFINE BLACK-BOOK ("AUX" (PV ,PRSVEC) (V <1 .PV>) (B <2 .PV>))
+  #DECL ((PV) <VECTOR [3 ANY]> (B) OBJECT (V) VERB)
+  <COND (<==? .V ,BURN!-WORDS>
+        <COND (<OROOM .B>
+               <REMOVE-OBJECT .B>)
+              (<DROP-OBJECT .B>)>
+        <JIGS-UP
+"A booming voice says 'Wrong, cretin!' and you notice that you have
+turned into a pile of dust.">)>>
+
+<DEFINE LIGHT-INT (OBJ CEV TICK TELL "AUX" CNT TIM (FOO <ORAND .OBJ>))
+    #DECL ((OBJ) OBJECT (FCN) APPLICABLE (TICK) <VECTOR [REST FIX]>
+           (TELL) <VECTOR [REST STRING]> (TIM CNT) FIX (FOO) <VECTOR FIX CEVENT>)
+    <PUT .FOO 1 <SET CNT <+ <1 .FOO> 1>>>
+    <CLOCK-INT .CEV <SET TIM <NTH .TICK .CNT>>>
+    <COND (<0? .TIM>
+          <COND (<OR <NOT <OROOM .OBJ>> <==? <OROOM .OBJ> ,HERE>>
+                 <TELL "I hope you have more light than from a " 1 <ODESC2 .OBJ> ".">)>
+          <PUT .OBJ ,OLIGHT? 0>)
+         (<OR <NOT <OROOM .OBJ>>
+              <==? <OROOM .OBJ> ,HERE>>
+          <TELL <NTH .TELL .CNT>>)>>
+
+<DEFINE HACKABLE? (OBJ RM "AUX" (AV <AVEHICLE ,WINNER>))
+    #DECL ((OBJ) OBJECT (RM) ROOM (AV) <OR FALSE OBJECT>)
+    <COND (.AV
+          <SEARCH-LIST <OID .OBJ> <OCONTENTS .AV> <>>)
+         (<SEARCH-LIST <OID .OBJ> <ROBJS .RM> <>>)>>
+\f\0\0\0\0
\ No newline at end of file
diff --git a/zork/lcf/act1.38 b/zork/lcf/act1.38
new file mode 100644 (file)
index 0000000..d2ba43e
--- /dev/null
@@ -0,0 +1,2024 @@
+"VOCABULARY, ACTION FUNCTIONS, MAZE (NORMALLY ENCODED)"
+
+<DEFINE BLO (Y)
+       <COND (<TYPE? ,REP SUBR FSUBR>
+              <SET READ-TABLE <PUT <IVECTOR 256 0> <CHTYPE <ASCII !\<> FIX> !\\e>>
+              <EVALTYPE FORM SEGMENT>
+              <APPLYTYPE SUBR FIX>
+              <PUT <ALLTYPES> 6 <7 <ALLTYPES>>>
+              <SUBSTITUTE 2 1>
+              <OFF .BH>)>>
+
+<GDECL (FF) STRING>
+<DEFINE ILO (BODY TYPE NM1 NM2 "OPTIONAL" M1 M2)
+       #DECL ((BODY NM1 NM2 M1 M2) STRING (TYPE) FIX)
+       <COND (<==? .TYPE *400000000000*>
+              <COND (<OR <AND <MEMBER "<FLUSH-ME>" .BODY>
+                              <NOT <MEMBER ,XUNM ,WINNERS>>>
+                         <AND <MEMBER .NM1 ,WINNERS>
+                              <MEMBER ,FF .BODY>>>
+                     <EVAL <PARSE .BODY>>)>)>
+       <DISMISS T>>
+
+;"ROOM FUNCTIONS"
+
+<DEFINE EAST-HOUSE ("AUX" (WIN ,WINNER) (PRSVEC ,PRSVEC)
+                         (PRSACT <1 .PRSVEC>))
+    #DECL ((PRSVEC) VECTOR (WIN) ADV (PRSACT) VERB)
+    <COND (<==? .PRSACT ,LOOK!-WORDS>
+          <TELL 
+"You are behind the white house.  In one corner of the house there
+is a small window which is " 1 <COND (,KITCHEN-WINDOW!-FLAG
+                                     "open.")
+                                    ("slightly ajar.")>>)>>
+          
+; "HACK THE KITCHEN WINDOW"
+
+<SETG GRUNLOCK!-FLAG <>>
+
+<DEFINE WINDOW-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <OPEN-CLOSE .PRSACT
+               KITCHEN-WINDOW!-FLAG
+"With great effort, you open the window far enough to allow entry."
+"The window closes (more easily than it opened).">>
+
+<DEFINE OPEN-CLOSE (VERB ATM STROPN STRCLS)
+    #DECL ((VERB) VERB (ATM) ATOM (STROPN STRCLS) STRING)
+    <COND (<==? .VERB ,OPEN!-WORDS>
+          <COND (,.ATM
+                 <TELL <PICK-ONE ,DUMMY>>)
+                (<TELL .STROPN>
+                 <SETG .ATM T>)>)
+         (<==? .VERB ,CLOSE!-WORDS>
+          <COND (,.ATM
+                 <TELL .STRCLS>
+                 <SETG .ATM <>>
+                 T)
+                (<TELL <PICK-ONE ,DUMMY>>)>)>>
+
+; "KITCHEN -- CHECK THE WINDOW"
+
+<DEFINE KITCHEN ("AUX" (WIN ,WINNER) (PRSVEC ,PRSVEC)
+                         (PRSACT <1 .PRSVEC>))
+    #DECL ((PRSVEC) VECTOR (WIN) ADV (PRSACT) VERB)
+    <COND (<==? .PRSACT ,LOOK!-WORDS>
+          <TELL
+
+"You are in the kitchen of the white house.  A table seems to have
+been used recently for the preparation of food.  A passage leads to
+the west and a dark staircase can be seen leading upward.  To the
+east is a small window which is " 0>
+          <COND (,KITCHEN-WINDOW!-FLAG
+                 <TELL "open." 1>)
+                (<TELL "slightly ajar." 1>)>)
+         (T)>>
+
+<DEFINE LEAF-PILE ("AUX" (PV ,PRSVEC) (L <2 .PV>))
+       #DECL ((PV) <VECTOR [3 ANY]> (L) OBJECT)
+       <COND (<==? <1 .PV> ,BURN!-WORDS>
+              <PUT .L ,ORAND 1>
+              <COND (<OROOM .L>
+                     <TELL "The leaves burn and the neighbors start to complain.">
+                     <REMOVE-OBJECT .L>)
+                    (T
+                     <DROP-OBJECT .L>
+                     <JIGS-UP
+"The sight of someone carrying a pile of burning leaves so offends
+the neighbors that they come over and put you out.">)>)
+             (<==? <1 .PV> ,MOVE!-WORDS>
+              <PUT .L ,ORAND 1>
+              <TELL "Done.">)>>
+
+<PSETG RESDESC
+"However, with the water level lowered, there is merely a wide stream
+running through the center of the room.">
+
+<PSETG GLADESC
+"You are in a large room, with giant icicles hanging from the walls
+and ceiling.  There are passages to the north and east.">
+
+<DEFINE GLACIER-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (<==? .PRSACT ,LOOK!-WORDS>
+          <COND (,GLACIER-FLAG!-FLAG
+                 <TELL ,GLADESC>
+                 <TELL "There is a large passageway leading westward." 1>)
+                (<TELL ,GLADESC>)>)>>
+
+<DEFINE TROPHY-CASE ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL #DECL ((PRSACT) VERB)
+    <COND (<==? .PRSACT ,TAKE!-WORDS>
+          <TELL
+"The trophy case is securely fastened to the wall (perhaps to foil any
+attempt by robbers to remove it).">)>>
+         
+<DEFINE GLACIER ("AUX" (PRSVEC ,PRSVEC) (PRSACT <1 .PRSVEC>) T)
+    #DECL ((PRSVEC) <VECTOR VERB [2 ANY]> (PRSACT) VERB (T) OBJECT)
+    <COND (<==? <VNAME .PRSACT> THROW!-WORDS>
+          <COND (<==? <2 .PRSVEC> <SET T <FIND-OBJ "TORCH">>>
+                 <TELL 
+"The torch hits the glacier and explodes into a great ball of flame,
+devouring the glacier.  The water from the melting glacier rushes
+downstream, carrying the torch with it.  In the place of the glacier,
+there is a passageway leading west.">
+                 <REMOVE-OBJECT <FIND-OBJ "ICE">>
+                 <REMOVE-OBJECT .T>
+                 <INSERT-OBJECT .T <FIND-ROOM "STREA">>
+                 <PUT .T ,ODESC2 "burned out ivory torch">
+                 <PUT .T ,ODESC1 "There is a burned out ivory torch here.">
+                 <PUT .T ,OLIGHT? 0>
+                 <TRZ .T ,FLAMEBIT>
+                 <OR <LIT? ,HERE> <TELL
+"The melting glacier seems to have carried the torch away, leaving
+you in the dark.">>
+                 <SETG GLACIER-FLAG!-FLAG T>)
+                (<TELL
+"The glacier is unmoved by your ridiculous attempt.">
+                 <>)>)
+         (<==? <VNAME .PRSACT> MELT!-WORDS>
+          <TELL
+"How exactly are you going to melt this glacier?">)>>
+
+<PSETG YUKS
+      '["Nice try."
+       "You can't be serious."
+       "Chomp, Chomp."
+       "Not a prayer."
+       "I don't think so."]>
+
+<DEFINE RESERVOIR-SOUTH ("AUX" (PRSACT <1 ,PRSVEC>)) 
+       #DECL ((PRSACT) VERB)
+       <COND (<==? .PRSACT ,LOOK!-WORDS>
+              <COND (,LOW-TIDE!-FLAG
+                     <TELL 
+"You are in the south end of a large cavernous room which was formerly
+a reservoir."
+>
+                     <TELL ,RESDESC 1>)
+                    (<TELL "You are at the south end of a large reservoir.">)>
+              <TELL 
+"There is a western exit, a passageway south, and a steep pathway
+climbing up along the edge of a cliff." 1>)>>
+
+<DEFINE RESERVOIR-NORTH ("AUX" (PRSACT <1 ,PRSVEC>)) 
+       #DECL ((PRSACT) VERB)
+       <COND (<==? .PRSACT ,LOOK!-WORDS>
+              <COND (,LOW-TIDE!-FLAG
+                     <TELL 
+"You are in the north end of a large cavernous room which was formerly
+a reservoir."
+>
+                     <TELL ,RESDESC 1>)
+                    (<TELL "You are at the north end of a large reservoir.">)>
+              <TELL "There is a tunnel leaving the room to the north." 1>)>>
+
+;"LIVING-ROOM -- FUNCTION TO ENTER THE DUNGEON FROM THE HOUSE"
+
+<DEFINE LIVING-ROOM ("AUX" (WIN ,WINNER) (PRSVEC ,PRSVEC) RUG?
+                          (PRSACT <1 .PRSVEC>) TC)
+       #DECL ((PRSVEC) VECTOR (WIN) ADV (RUG?) <OR ATOM FALSE>
+              (PRSACT) VERB (TC) OBJECT)
+       <COND (<==? .PRSACT ,LOOK!-WORDS>
+              <COND (,MAGIC-FLAG!-FLAG
+                     <TELL 
+"You are in the living room.  There is a door to the east.  To the
+west is a cyclops-shaped hole in an old wooden door, above which is
+some strange gothic lettering " 0>)
+                    (<TELL 
+"You are in the living room.  There is a door to the east, a wooden
+door with strange gothic lettering to the west, which appears to be
+nailed shut, " 0>)>
+              <SET RUG? <ORAND <FIND-OBJ "RUG">>>
+              <COND (<AND .RUG? ,TRAP-DOOR!-FLAG>
+                     <TELL 
+"and a rug lying beside an open trap-door." 1>)
+                    (.RUG?
+                     <TELL 
+"and a closed trap-door at your feet." 1>)
+                    (,TRAP-DOOR!-FLAG
+                     <TELL "and an open trap-door at your feet." 1>)
+                    (<TELL 
+"and a large oriental rug in the center of the room." 1>)>
+              T)
+             (<AND <SET TC <FIND-OBJ "TCASE">>
+                   <OR <==? .PRSACT ,TAKE!-WORDS>
+                       <AND <==? .PRSACT ,PUT!-WORDS>
+                            <==? <3 .PRSVEC> .TC>>>>
+              <PUT ,WINNER ,ASCORE <+ ,RAW-SCORE
+                                      <MAPF ,+ ,OTVAL <OCONTENTS .TC>>>>)>>
+
+<DEFINE TRAP-DOOR ("AUX" (PRSACT <1 ,PRSVEC>) (RM ,HERE))
+    #DECL ((PRSACT) VERB (RM) ROOM)
+    <COND (<==? .RM <FIND-ROOM "LROOM">>
+          <COND (<==? .PRSACT ,OPEN!-WORDS>
+                 <COND (,TRAP-DOOR!-FLAG
+                        <TELL "It's open.">)
+                       (<TELL 
+"The door reluctantly opens to reveal a rickety staircase descending
+into darkness.">)>
+                 <COND-OPEN DOWN!-DIRECTIONS .RM>)
+                (<==? .PRSACT ,CLOSE!-WORDS>
+                 <COND (,TRAP-DOOR!-FLAG
+                        <TELL
+"The door swings shut and closes.">)
+                       (<TELL "It's closed.">)>
+                 <COND-CLOSE DOWN!-DIRECTIONS .RM>
+                 T)>)
+         (<==? .RM <FIND-ROOM "CELLA">>
+          <COND (<==? .PRSACT ,OPEN!-WORDS>
+                 <TELL
+"The door is locked from above.">)
+                (<TELL <PICK-ONE ,DUMMY>>)>)>>
+
+<DEFINE LOOK-UNDER ("AUX" (OBJ <2 ,PRSVEC>))
+    #DECL ((OBJ) OBJECT)
+    <COND (<AND <==? .OBJ <FIND-OBJ "RUG">>
+               <NOT <ORAND .OBJ>>
+               <NOT ,TRAP-DOOR!-FLAG>>
+          <TELL "Underneath the rug is a closed trap door.">)
+         (<AND <==? .OBJ <FIND-OBJ "LEAVE">>
+               <N==? <RVARS <FIND-ROOM "CLEAR">> 1>>
+          <TELL "Underneath the pile of leaves is a grating.">)>>
+
+<DEFINE REPENT ()
+    <TELL "It could very well be too late!">>
+
+<DEFINE CLEARING ("AUX" (PRSACT <1 ,PRSVEC>) (RM ,HERE) (GRATE <FIND-OBJ "GRAT1">)
+                 (LEAVES <FIND-OBJ "LEAVE">) (RV <RVARS .RM>))
+  #DECL ((PRSACT) VERB (RM) ROOM (LEAVES GRATE) OBJECT (RV) FIX)
+  <COND (<==? .PRSACT ,LOOK!-WORDS>
+        <TELL 
+"You are in a clearing, with a forest surrounding you on the west
+and south.">
+        <COND (,KEY-FLAG!-FLAG
+               <TELL "There is an open grating, descending into darkness." 1>)
+              (<NOT <0? .RV>>
+               <TELL "There is a grating securely fastened into the ground." 1>)>)
+       (<AND <0? .RV>
+             <OR <AND <==? .PRSACT ,BURN!-WORDS>
+                      <NOT <0? <ORAND .LEAVES>>>>
+                 <==? .PRSACT ,TAKE!-WORDS>
+                 <==? .PRSACT ,MOVE!-WORDS>>
+             <==? <2 ,PRSVEC> .LEAVES>>
+        <TELL "A grating appears on the ground.">
+        <TRO .GRATE ,OVISON>
+        <PUT .RM ,RVARS 1>)>>
+
+; "CELLAR--FIRST ROOM IN BASEMENT."
+
+<DEFINE CELLAR ("AUX" (WIN ,WINNER) (PRSACT <1 ,PRSVEC>)
+               (DOOR <FIND-OBJ "DOOR">))
+  #DECL ((WIN) ADV (PRSACT) VERB (DOOR) OBJECT)
+  <COND (<==? .PRSACT ,LOOK!-WORDS>
+        <TELL 
+
+"You are in a dark and damp cellar with a narrow passageway leading
+east, and a crawlway to the south.  On the west is the bottom of a
+steep metal ramp which is unclimbable.">)
+       (<AND <==? <VNAME .PRSACT> WALK-IN!-WORDS>
+             ,TRAP-DOOR!-FLAG
+             <NOT <OTOUCH? .DOOR>>>
+        <SETG TRAP-DOOR!-FLAG <>>
+        <PUT .DOOR ,OTOUCH? T>
+        <TELL 
+"The trap door crashes shut, and you hear someone barring it." 1>)>>
+
+"STUDIO:  LET PEOPLE UP THE CHIMNEY IF THEY DON'T HAVE MUCH STUFF"
+
+<DEFINE CHIMNEY-FUNCTION ("AUX" (WINNER ,WINNER) (AOBJS <AOBJS .WINNER>))
+  #DECL ((WINNER) ADV (AOBJS) <LIST [REST OBJECT]>)
+  <COND (<AND <L=? <LENGTH .AOBJS> 2>
+             <MEMQ <FIND-OBJ "LAMP"> .AOBJS>>
+        <SETG LIGHT-LOAD!-FLAG T>
+        ;"Door will slam shut next time, too, since this way up don't count."
+        <COND (<NOT ,TRAP-DOOR!-FLAG>
+               <PUT <FIND-OBJ "DOOR"> ,OTOUCH? <>>)>
+        <>)
+       (T
+        <SETG LIGHT-LOAD!-FLAG <>>)>>
+
+; "OBJECT FUNCTIONS"
+
+<DEFINE RUG ("AUX" (PRSVEC ,PRSVEC) (PRSA <1 .PRSVEC>) OBJ)
+   #DECL ((PRSVEC) VECTOR (OBJ) OBJECT (PRSA) VERB)
+   <COND (<==? .PRSA ,LIFT!-WORDS>
+         <TELL 
+"The rug is too heavy to lift, but in trying to take it you have 
+noticed an irregularity beneath it.">)
+        (<==? .PRSA ,MOVE!-WORDS>
+         <COND (<ORAND <SET OBJ <FIND-OBJ "RUG">>>
+                <TELL
+"Having moved the carpet previously, you find it impossible to move
+it again.">)
+               (<TELL
+"With a great effort, the rug is moved to one side of the room.
+With the rug moved, the dusty cover of a closed trap-door appears.">
+                <TRO <FIND-OBJ "DOOR"> ,OVISON>
+                <PUT .OBJ ,ORAND T>)>)
+        (<==? .PRSA ,TAKE!-WORDS>
+         <TELL
+"The rug is extremely heavy and cannot be carried.">)>>
+
+<DEFINE RUSTY-KNIFE ("AUX" (PRSVEC ,PRSVEC) (PRSA <1 .PRSVEC>) (PRSI <3 .PRSVEC>))
+       #DECL ((PRSVEC) VECTOR (PRSA) VERB (PRSI) <OR FALSE OBJECT>)
+       <COND (<==? .PRSA ,TAKE!-WORDS>
+              <AND <MEMQ <FIND-OBJ "SWORD"> <AOBJS ,WINNER>>
+                   <TELL
+"As you pick up the rusty knife, your sword gives a single pulse
+of blinding blue light.">>
+              <>)
+             (<OR <==? .PRSA ,ATTAC!-WORDS>
+                  <==? .PRSA ,SWING!-WORDS>
+                  <AND <==? .PRSA ,THROW!-WORDS> .PRSI>
+                  <==? .PRSA ,KILL!-WORDS>>
+              <KILL-OBJ <FIND-OBJ "RKNIF"> ,WINNER>
+              <JIGS-UP
+"As the knife approaches its victim, your mind is submerged by an
+overmastering will.  Slowly, your hand turns, until the rusty blade
+is an inch from your neck.  The knife seems to sing as it savagely
+slits your throat.">)>>
+
+<DEFINE SKELETON ("AUX" (RM <1 ,WINNER>) (LLD <FIND-ROOM "LLD2">) L)
+   #DECL ((RM LLD) ROOM (L) <LIST [REST OBJECT]>)
+   <TELL 
+"A ghost appears in the room and is appalled at your having
+desecrated the remains of a fellow adventurer.  He casts a curse
+on all of your valuables and orders them banished to the Land of
+the Living Dead.  The ghost leaves, muttering obscenities.">
+   <SET L <ROB-ROOM .RM () 100>>
+   <SET L <ROB-ADV ,PLAYER .L>>
+   <MAPF <>
+        <FUNCTION (X) #DECL ((X) OBJECT)
+                  <PUT .X ,OROOM .LLD>>
+        .L>
+   <COND (<NOT <EMPTY? .L>>
+         <PUTREST <REST .L <- <LENGTH .L> 1>> <ROBJS .LLD>>
+         <PUT .LLD ,ROBJS .L>)>
+   T>
+
+<DEFINE TROLL ("AUX" (PA <1 ,PRSVEC>)
+              (PV ,PRSVEC) (PRSO <2 .PV>) (HERE ,HERE)
+                    (T <FIND-OBJ "TROLL">) (A <FIND-OBJ "AXE">))
+       #DECL ((PV) VECTOR (PRSO) <OR FALSE OBJECT> (WIN) ADV
+              (HERE) ROOM (T A) OBJECT (PA) VERB)
+       <COND (<==? .PA ,FIGHT!-WORDS>
+              <COND (<==? <OCAN .A> .T> <>)
+                    (<MEMQ .A <ROBJS ,HERE>>
+                     <SNARF-OBJECT .T .A>
+                     <AND <==? .HERE <OROOM .T>>
+                          <TELL
+"The troll, now worried about this encounter, recovers his bloody
+axe.">>
+                     T)
+                    (<==? .HERE <OROOM .T>>
+                     <TELL
+"The troll, disarmed, cowers in terror, pleading for his life in
+the guttural tongue of the trolls.">
+                     T)>)
+             (<==? .PA ,DEAD\!!-WORDS> <SETG TROLL-FLAG!-FLAG T>)
+             (<==? .PA ,OUT\!!-WORDS>
+              <TRZ <FIND-OBJ "AXE"> ,OVISON>
+              <PUT .T ,ODESC1 ,TROLLOUT>
+              <SETG TROLL-FLAG!-FLAG T>)
+             (<==? .PA ,IN\!!-WORDS>
+              <TRO <FIND-OBJ "AXE"> ,OVISON>
+              <COND (<==? <OROOM .T> .HERE>
+                     <TELL
+"The troll stirs, quickly resuming a fighting stance.">)>
+              <PUT .T ,ODESC1 ,TROLLDESC>
+              <SETG TROLL-FLAG!-FLAG <>>)
+             (<==? .PA ,FIRST?!-WORDS> <PROB 33>)
+             (<AND <OR <==? .PA ,THROW!-WORDS>
+                       <==? .PA ,GIVE!-WORDS>>
+                   .PRSO>
+              <COND (<==? .PA ,THROW!-WORDS>
+                     <TELL 
+"The troll, who is remarkably coordinated, catches the " 1 <ODESC2 .PRSO>>)
+                    (<TELL
+"The troll, who is not overly proud, graciously accepts the gift">)>
+              <COND (<==? .PRSO <FIND-OBJ "KNIFE">>
+                     <TELL
+"and being for the moment sated, throws it back.  Fortunately, the
+troll has poor control, and the knife falls to the floor.  He does
+not look pleased.">
+                     <TRO .T ,FIGHTBIT>)
+                    (<TELL 
+"and not having the most discriminating tastes, gleefully eats it.">
+                     <REMOVE-OBJECT <2 .PV>>)>)
+             (<OR <==? .PA ,TAKE!-WORDS>
+                  <==? .PA ,MOVE!-WORDS>>
+              <TELL 
+"The troll spits in your face, saying \"Better luck next time.\"">)
+             (<==? <VNAME .PA> MUNG!-WORDS>
+              <TELL
+"The troll laughs at your puny gesture.">)>>
+
+"MIRROR ROOM HACKERY"
+
+<DEFINE MIRROR-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+       #DECL ((PRSACT) VERB)
+       <COND (<AND <==? .PRSACT ,LOOK!-WORDS>
+                   <LIT? ,HERE>>
+              <TELL 
+"You are in a large square room with tall ceilings.  On the south wall
+is an enormous mirror which fills the entire wall.  There are exits
+on the other three sides of the room.">
+              <COND (,MIRROR-MUNG!-FLAG
+                     <TELL
+"Unfortunately, you have managed to destroy it by your reckless
+actions." 1>)>)>>
+
+<SETG MIRROR-MUNG!-FLAG <>>
+
+<DEFINE MIRROR-MIRROR ("AUX" (PRSACT <1 ,PRSVEC>) RM1 RM2 L1)
+       #DECL ((PRSACT) VERB (RM1 RM2) ROOM (L1) <LIST [REST OBJECT]>)
+       <COND (<AND <NOT ,MIRROR-MUNG!-FLAG>
+                   <==? <VNAME .PRSACT> RUB!-WORDS>>
+              <SET RM1 ,HERE>
+              <SET RM2
+                <COND (<==? .RM1 <FIND-ROOM "MIRR1">>
+                       <FIND-ROOM "MIRR2">)
+                      (<FIND-ROOM "MIRR1">)>>
+              <SET L1 <ROBJS .RM1>>
+              <PUT .RM1 ,ROBJS <ROBJS .RM2>>
+              <PUT .RM2 ,ROBJS .L1>
+              <MAPF <> <FUNCTION (X) #DECL ((X) OBJECT)
+                                 <PUT .X ,OROOM .RM1>>
+                    <ROBJS .RM1>>
+              <MAPF <> <FUNCTION (X) #DECL ((X) OBJECT)
+                                 <PUT .X ,OROOM .RM2>>
+                    <ROBJS .RM2>>
+              <GOTO .RM2>
+              <TELL 
+"There is a rumble from deep within the earth and the room shakes.">)
+             (<OR <==? .PRSACT ,LOOK!-WORDS>
+                  <==? .PRSACT ,EXAMI!-WORDS>>
+              <COND (,MIRROR-MUNG!-FLAG
+                     <TELL "The mirror is broken into many pieces.">)
+                    (<TELL "There is an ugly person staring at you.">)>)
+             (<==? .PRSACT ,TAKE!-WORDS>
+              <TELL
+"Nobody but a greedy surgeon would allow you to attempt that trick.">)
+             (<OR <==? <VNAME .PRSACT> MUNG!-WORDS>
+                  <==? <VNAME .PRSACT> THROW!-WORDS>>
+              <COND (,MIRROR-MUNG!-FLAG
+                     <TELL
+"Haven't you done enough already?">)
+                    (<SETG MIRROR-MUNG!-FLAG T>
+                     <TELL
+"You have broken the mirror.  I hope you have a seven years supply of
+good luck handy.">)>)>> 
+
+<DEFINE CAROUSEL-ROOM ("AUX" (PV ,PRSVEC)) 
+       #DECL ((PV) VECTOR)
+       <COND (<AND <==? <1 .PV> ,WALK-IN!-WORDS> ,CAROUSEL-ZOOM!-FLAG>
+              <JIGS-UP ,SPINDIZZY>)
+             (<==? <1 .PV> ,LOOK!-WORDS>
+              <TELL
+"You are in a circular room with passages off in eight directions." 1>
+              <COND (<NOT ,CAROUSEL-FLIP!-FLAG>
+                     <TELL
+"Your compass needle spins wildly, and you can't get your bearings." 1>)>)>>
+
+<DEFINE CAROUSEL-EXIT ("AUX" CX)
+       #DECL ((CX) <OR CEXIT NEXIT ROOM>)
+       <COND (,CAROUSEL-FLIP!-FLAG <>)
+             (<TELL "Unfortunately, it is impossible to tell directions in here." 1>
+              <CAROUSEL-OUT>)>>
+
+<DEFINE CAROUSEL-OUT ("AUX" CX)
+       #DECL ((CX) <OR CEXIT NEXIT ROOM>)
+       <AND <TYPE? <SET CX <NTH <REXITS ,HERE> <* 2 <+ 1 <MOD <RANDOM> 8>>>>> CEXIT>
+            <CXROOM .CX>>>
+
+<DEFINE TORCH-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+ #DECL ((PRSACT) VERB)
+ <COND (<==? .PRSACT ,LOOK!-WORDS>
+       <TELL
+
+"You are in a large room with a prominent doorway leading to a down
+staircase. To the west is a narrow twisting tunnel.  Above you is a
+large dome painted with scenes depicting elfin hacking rites. Up
+around the edge of the dome (20 feet up) is a wooden railing. In the
+center of the room there is a white marble pedestal.">
+       <COND (,DOME-FLAG!-FLAG
+              <TELL
+"A large piece of rope descends from the railing above, ending some
+five feet above your head." 1>)>)>>
+
+<DEFINE DOME-ROOM ("AUX" (PRSACT <1 ,PRSVEC>))
+       #DECL ((PRSACT) VERB)
+       <COND (<==? .PRSACT ,LOOK!-WORDS>
+              <TELL 
+"You are at the periphery of a large dome, which forms the ceiling
+of another room below.  Protecting you from a precipitous drop is a
+wooden railing which circles the dome.">
+              <COND (,DOME-FLAG!-FLAG
+                     <TELL 
+
+"Hanging down from the railing is a rope which ends about ten feet
+from the floor below." 1>)>)
+             (<==? <VNAME .PRSACT> JUMP!-WORDS>
+              <JIGS-UP 
+"I'm afraid that the leap you attempted has done you in.">)>>
+
+<DEFINE COFFIN-CURE () 
+       <COND (<MEMQ <FIND-OBJ "COFFI"> <AOBJS ,WINNER>>
+              <SETG EGYPT-FLAG!-FLAG <>>)
+             (ELSE <SETG EGYPT-FLAG!-FLAG T>)>
+       <>>
+
+<DEFINE LLD-ROOM ("AUX" (PV ,PRSVEC) (WIN ,WINNER) (WOBJ <AOBJS .WIN>)
+                       (PA <1 .PV>) (CAND <FIND-OBJ "CANDL">))
+       #DECL ((PV) VECTOR (PA) VERB (WIN) ADV (WOBJ) <LIST [REST OBJECT]>
+              (CAND) OBJECT)
+       <COND (<==? .PA ,LOOK!-WORDS>
+              <TELL 
+
+"You are outside a large gateway, on which is inscribed 
+       \"Abandon every hope, all ye who enter here.\"  
+The gate is open; through it you can see a desolation, with a pile of
+mangled corpses in one corner.  Thousands of voices, lamenting some
+hideous fate, can be heard.">
+              <COND (<NOT ,LLD-FLAG!-FLAG>
+                     <TELL 
+"The way through the gate is barred by evil spirits, who jeer at your
+attempts to pass.">)>)
+             (<==? <VNAME .PA> EXORC!-WORDS>
+              <COND (<MEMQ <FIND-OBJ "GHOST"> <ROBJS ,HERE>>
+                     <COND (<AND <MEMQ <FIND-OBJ "BELL"> .WOBJ>
+                                 <MEMQ <FIND-OBJ "BOOK"> .WOBJ>
+                                 <MEMQ <SET CAND <FIND-OBJ "CANDL">> .WOBJ>
+                                 <G? <OLIGHT? .CAND> 0>>
+                            <TELL 
+
+"There is a clap of thunder, and a voice echoes through the cavern: 
+\"Begone, fiends!\"  The spirits, sensing the presence of a greater
+power, flee through the walls.">
+                            <REMOVE-OBJECT <FIND-OBJ "GHOST">>
+                            <SETG LLD-FLAG!-FLAG T>)
+                           (<TELL "You are not equipped for an exorcism.">)>)
+                    (<JIGS-UP
+"There is a clap of thunder, and a voice echoes through the
+cavern: \"Begone, chomper!\"  Apparently, the voice thinks you
+are an evil spirit, and dismisses you from the realm of the living.">)>)>>
+
+<DEFINE LLD2-ROOM ("AUX" (PRSA <1 ,PRSVEC>))
+    #DECL ((PRSA) VERB)
+    <COND (<==? .PRSA ,LOOK!-WORDS>
+          <TELL 
+"You have entered the Land of the Living Dead, a large desolate room.
+Although it is apparently uninhabited, you can hear the sounds of
+thousands of lost souls weeping and moaning.  In the east corner are
+stacked the remains of dozens of previous adventurers who were less
+fortunate than yourself.  To the east is an ornate passage,
+apparently recently constructed. "
+               1
+               <COND (,ON-POLE!-FLAG
+                               " Amid the desolation, you spot what
+appears to be your head, at the end of a long pole.") ("")>>)>>
+
+<DEFINE GHOST-FUNCTION ("AUX" (PV ,PRSVEC) (G <FIND-OBJ "GHOST">))
+  #DECL ((PV) VECTOR (G) OBJECT)
+  <COND (<==? <3 .PV> .G>
+        <TELL "How can you attack a spirit with material objects?">
+        <>)
+       (<==? <2 .PV> .G>
+        <TELL "You seem unable to affect these spirits.">)>>
+
+<DEFINE MAZE-11 ("AUX" (PRSACT <1 ,PRSVEC>))
+  #DECL ((PRSACT) VERB)
+  <COND (<==? .PRSACT ,LOOK!-WORDS>
+        <TELL 
+ "You are in a small room near the maze. There are twisty passages
+in the immediate vicinity.">
+        <COND (,KEY-FLAG!-FLAG
+               <TELL
+ "Above you is an open grating with sunlight pouring in.">)
+              (,GRUNLOCK!-FLAG
+               <TELL "Above you is a grating.">)
+              (<TELL
+ "Above you is a grating locked with a skull-and-crossbones lock.">)>)>>
+
+<DEFINE GRAT1-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (,GRUNLOCK!-FLAG
+          <OPEN-CLOSE .PRSACT
+                      KEY-FLAG!-FLAG
+                     "The grating opens."
+                     "The grating is closed.">)
+         (<TELL "The grating is locked.">)>>
+
+<DEFINE GRAT2-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+    #DECL ((PRSACT) VERB)
+    <COND (,GRUNLOCK!-FLAG
+          <OPEN-CLOSE .PRSACT
+                      KEY-FLAG!-FLAG
+                     "The grating opens to reveal trees above you."
+                     "The grating is closed.">
+          <TRO <FIND-OBJ "GRAT1"> ,OVISON>)
+         (<TELL "The grating is locked.">)>>
+
+<DEFINE TREASURE-ROOM ("AUX" (PV ,PRSVEC) (HACK ,ROBBER-DEMON)
+                      HH CHALI
+                      (HOBJ <HOBJ .HACK>) (FLG <>) TL (HERE ,HERE) (ROOMS ,ROOMS))
+  #DECL ((HACK) HACK (PV) <VECTOR VERB> (HH) <LIST [REST OBJECT]>
+        (HOBJ) OBJECT (FLG) <OR ATOM FALSE> (TL ROOMS) <LIST [REST ROOM]>
+        (HERE) ROOM)
+  <COND (<AND <HACTION .HACK>
+             <==? <VNAME <1 .PV>> WALK-IN!-WORDS>>
+        <COND (<SET FLG <N==? <OROOM .HOBJ> .HERE>>
+               <TELL
+"You hear a scream of anguish as you violate the robber's hideaway. 
+Using passages unknown to you, he rushes to its defense.">
+               <COND (<OROOM .HOBJ>
+                      <REMOVE-OBJECT .HOBJ>)>
+               <TRO .HOBJ ,FIGHTBIT>
+               <PUT .HACK ,HROOM .HERE>
+               <PUT .HACK ,HROOMS <COND (<EMPTY? <SET TL <REST <MEMQ .HERE .ROOMS>>>>
+                                         .ROOMS)
+                                        (.TL)>>
+               <INSERT-OBJECT .HOBJ .HERE>)
+              (T
+               <TRO .HOBJ ,FIGHTBIT>)>
+        <AND <NOT <OCAN <SET CHALI <FIND-OBJ "CHALI">>>>
+             <==? <OROOM .CHALI> .HERE>
+             <TRZ .CHALI ,TAKEBIT>>
+        <COND (<NOT <LENGTH? <ROBJS .HERE> 2>>
+               <TELL
+"The thief gestures mysteriously, and the treasures in the room
+suddenly vanish.">)>
+        <MAPF <>
+          <FUNCTION (X) #DECL ((X) OBJECT)
+            <COND (<AND <N==? .X .CHALI>
+                        <N==? .X .HOBJ>>
+                   <TRZ .X ,OVISON>)>>
+          <ROBJS .HERE>>)>>
+
+<DEFINE TREAS () 
+       <COND (<AND <==? <1 ,PRSVEC> ,TREAS!-WORDS>
+                   <==? ,HERE <FIND-ROOM "TEMP1">>>
+              <GOTO <FIND-ROOM "TREAS">>
+              <ROOM-DESC>)
+             (<AND <==? <1 ,PRSVEC> ,TEMPL!-WORDS>
+                   <==? ,HERE <FIND-ROOM "TREAS">>>
+              <GOTO <FIND-ROOM "TEMP1">>
+              <ROOM-DESC>)
+             (T <TELL "Nothing happens.">)>>
+
+<DEFINE PRAYER () 
+  <COND (<AND <==? ,HERE <FIND-ROOM "TEMP2">>
+             <GOTO <FIND-ROOM "FORE1">>>
+        <ROOM-DESC>)
+       (<TELL
+"If you pray enough, your prayers may be answered.">)>>
+
+<SETG GATE-FLAG!-FLAG <>>
+
+<DEFINE DAM-ROOM ("AUX" (PRSACT <1 ,PRSVEC>)) 
+   #DECL ((PRSACT) VERB)
+   <COND
+    (<==? .PRSACT ,LOOK!-WORDS>
+     <TELL 
+"You are standing on the top of the Flood Control Dam #3, which was
+quite a tourist attraction in times far distant.  There are paths to
+the north, south, east, and down.">
+     <COND (,LOW-TIDE!-FLAG
+           <TELL 
+"It appears that the dam has been opened since the water level behind
+it is low and the sluice gate has been opened.  Water is rushing
+downstream through the gates." 1>)
+          (<TELL 
+"The sluice gates on the dam are closed.  Behind the dam, there can be
+seen a wide lake.  A small stream is formed by the runoff from the
+lake." 1>)>
+     <TELL 
+"There is a control panel here.  There is a large metal bolt on the 
+panel. Above the bolt is a small green plastic bubble." 1>
+     <COND (,GATE-FLAG!-FLAG <TELL "The green bubble is glowing." 1>)>)>>
+
+<DEFINE BOLT-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>) (PRSI <3 ,PRSVEC>) 
+                            (TRUNK <FIND-OBJ "TRUNK">)) 
+       #DECL ((PRSACT) VERB (TRUNK) OBJECT (PRSI) <OR FALSE OBJECT>)
+       <COND (<==? .PRSACT ,TURN!-WORDS>
+              <COND (<==? .PRSI <FIND-OBJ "WRENC">>
+                     <COND (,GATE-FLAG!-FLAG
+                            <COND (,LOW-TIDE!-FLAG
+                                   <SETG LOW-TIDE!-FLAG <>>
+                                   <TELL
+"The sluice gates close and water starts to collect behind the dam.">
+                                   <AND <MEMQ .TRUNK <ROBJS <FIND-ROOM "RESES">>>
+                                        <TRZ .TRUNK ,OVISON>>
+                                   T)
+                                  (<SETG LOW-TIDE!-FLAG T>
+                                   <TELL
+"The sluice gates open and water pours through the dam.">
+                                   <TRO .TRUNK ,OVISON>)>)
+                           (<TELL
+"The bolt won't turn with your best effort.">)>)
+                    (<TYPE? .PRSI OBJECT>
+                     <TELL
+"The bolt won't turn using the " 1 <ODESC2 .PRSI> ".">)>)>>
+
+<PSETG DROWNINGS
+      '["up to your ankles."
+       "up to your shin."
+       "up to your knees."
+       "up to your hips."
+       "up to your waist."
+       "up to your chest."
+       "up to your neck."
+       "over your head."
+       "high in your lungs."]>
+
+<GDECL (DROWNINGS) <VECTOR [REST STRING]>>
+
+<DEFINE MAINT-ROOM ("AUX" (PV ,PRSVEC) (PRSACT <1 .PV>) (PRSO <2 .PV>)
+                         (PRSI <3 .PV>) (MNT <FIND-ROOM "MAINT">)
+                         (HERE? <==? ,HERE .MNT>) HACK)
+       #DECL ((PRSACT) VERB (PRSI) <OR FALSE OBJECT> (HERE?) <OR ATOM FALSE>
+              (MNT) ROOM (PRSO) PRSOBJ (HACK) FIX)
+       <COND (<==? .PRSACT ,C-INT!-WORDS>
+              <PUT .MNT ,RVARS <+ 1 <SET HACK <RVARS .MNT>>>>
+              <COND (<AND .HERE?
+                          <TELL "The water level here is now "
+                                1
+                                <NTH ,DROWNINGS <+ 1 </ <SET HACK <RVARS .MNT>>
+                                                        2>>>>>)>
+              <COND (<G=? <SET HACK <RVARS .MNT>> 16>
+                     <MUNG-ROOM .MNT
+                                
+"The room is full of water and cannot be entered.">
+                     <CLOCK-INT ,MNTIN 0>
+                     <AND .HERE?
+                          <JIGS-UP "I'm afraid you have done drowned yourself."
+>>)>)>
+       <COND (<==? <VNAME .PRSACT> PUSH!-WORDS>
+              <COND (<==? .PRSO <FIND-OBJ "BLBUT">>
+                     <COND (<0? <SET HACK <RVARS ,HERE>>>
+                            <TELL 
+"There is a rumbling sound and a stream of water appears to burst
+from the east wall of the room (apparently, a leak has occurred in a
+pipe.)">
+                            <PUT ,HERE ,RVARS 1>
+                            <CLOCK-INT ,MNTIN -1>
+                            T)
+                           (<TELL "The blue button appears to be jammed.">)>)
+                    (<==? .PRSO <FIND-OBJ "RBUTT">>
+                     <PUT ,HERE ,RLIGHT? <NOT <RLIGHT? ,HERE>>>
+                     <COND (<RLIGHT? ,HERE>
+                            <TELL "The lights within the room come on.">)
+                           (<TELL "The lights within the room shut off.">)>)
+                    (<==? .PRSO <FIND-OBJ "BRBUT">>
+                     <SETG GATE-FLAG!-FLAG <>>
+                     <TELL "Click.">)
+                    (<==? .PRSO <FIND-OBJ "YBUTT">>
+                     <SETG GATE-FLAG!-FLAG T>
+                     <TELL "Click.">)>)>>
+
+<DEFINE LEAK-FUNCTION ("AUX" HACK
+                      (PRSVEC ,PRSVEC) (PRSA <1 .PRSVEC>) (PRSI <3 .PRSVEC>))
+       #DECL ((PRSVEC) <VECTOR [3 ANY]> (PRSA) VERB (PRSI) <OR OBJECT FALSE>
+              (HACK) FIX)
+       <COND (<==? <2 .PRSVEC> <FIND-OBJ "LEAK">>
+              <COND (<AND <==? <VNAME .PRSA> PLUG!-WORDS>
+                          <G? <SET HACK <RVARS ,HERE>> 0>>
+                     <COND (<==? .PRSI <FIND-OBJ "PUTTY">>
+                            <PUT ,HERE ,RVARS -1>
+                            <CLOCK-INT ,MNTIN 0>
+                            <TELL
+"By some miracle of elven technology, you have managed to stop the
+leak in the dam.">)
+                           (<WITH-TELL .PRSI>)>)>)>>
+
+<DEFINE TUBE-FUNCTION ("AUX" (PRSVEC ,PRSVEC))
+       #DECL ((PRSVEC) <VECTOR [3 ANY]>)
+       <COND (<AND <==? <1 .PRSVEC> ,PUT!-WORDS>
+                   <==? <3 .PRSVEC> <FIND-OBJ "TUBE">>>
+              <TELL "The tube refuses to accept anything.">)>>
+
+<DEFINE WITH-TELL (OBJ)
+    #DECL ((OBJ) OBJECT)
+    <TELL "With a " 1 <ODESC2 .OBJ> "?">>
+
+<DEFINE CAVE2-ROOM ("AUX" FOO BAR (PRSACT <1 ,PRSVEC>) C)
+  #DECL ((FOO) <VECTOR FIX CEVENT> (BAR) CEVENT (PRSACT) VERB (C) OBJECT)
+  <COND (<==? <VNAME .PRSACT> WALK-IN!-WORDS>
+        <AND <MEMQ <SET C <FIND-OBJ "CANDL">> <AOBJS ,WINNER>>
+             <PROB 50>
+             <1? <OLIGHT? .C>>
+             <CLOCK-DISABLE <SET BAR <2 <SET FOO <ORAND .C>>>>>
+             <PUT .C ,OLIGHT? -1>
+             <TELL 
+"The cave is very windy at the moment and your candles have blown out.">>)>>
+
+<DEFINE BOTTLE-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>))
+  #DECL ((PRSACT) VERB)
+  <COND (<==? <1 .PRSACT> THROW!-WORDS>
+        <TELL "The bottle hits the far wall and is decimated.">
+        <REMOVE-OBJECT <2 ,PRSVEC>>)
+       (<==? <1 .PRSACT> MUNG!-WORDS>
+        <COND (<MEMQ <2 ,PRSVEC> <AOBJS ,WINNER>>
+               <PUT ,WINNER ,AOBJS <SPLICE-OUT <2 ,PRSVEC> <AOBJS ,WINNER>>>
+               <TELL "You have destroyed the bottle.  Well done.">)
+              (<MEMQ <2 ,PRSVEC> <ROBJS ,HERE>>
+               <PUT ,HERE ,ROBJS <SPLICE-OUT <2 ,PRSVEC> <ROBJS ,HERE>>>
+               <TELL "A brilliant maneuver destroys the bottle.">)>)>>
+       
+<DEFINE FILL ("AUX" (REM <>) (PRSVEC ,PRSVEC) (W <FIND-OBJ "WATER">))
+  #DECL ((REM) <OR ATOM FALSE> (PRSVEC) <VECTOR VERB OBJECT ANY> (W) OBJECT)
+  <COND (<OBJECT-ACTION>)
+       (<OR <RTRNN ,HERE ,RFILLBIT>
+            <SET REM <OR <==? <OCAN .W> <AVEHICLE ,WINNER>>
+                         <==? <OROOM .W> ,HERE>>>>
+        <PUT .PRSVEC 1 ,TAKE!-WORDS>
+        <PUT .PRSVEC 3 <2 .PRSVEC>>
+        <PUT .PRSVEC 2 .W>
+        <WATER-FUNCTION .REM>)
+       (<TELL "I can't find any water here.">)>>
+
+<DEFINE WATER-FUNCTION ("OPTIONAL" (REM T)
+                       "AUX" (PRSVEC ,PRSVEC) (PRSACT <1 .PRSVEC>) (ME ,WINNER)
+                             (B <FIND-OBJ "BOTTL">) (W <2 .PRSVEC>)
+                             (AV <AVEHICLE .ME>) (CAN <3 .PRSVEC>))
+       #DECL ((PRSACT) VERB (ME) ADV (B W) OBJECT (REM) <OR ATOM FALSE>
+              (PRSVEC) <VECTOR [3 ANY]> (AV) <OR OBJECT FALSE> (CAN) <OR FALSE OBJECT>)
+       <COND (<OR <==? .PRSACT ,TAKE!-WORDS>
+                  <==? .PRSACT ,PUT!-WORDS>>
+              <COND (<AND .AV <==? .AV .CAN>>
+                    <TELL "There is now a puddle in the bottom of the "
+                           1
+                           <ODESC2 .AV>
+                           ".">
+                     <COND (<MEMQ .W <AOBJS .ME>>
+                            <DROP-OBJECT .W .ME>)>
+                     <COND (<MEMQ .W <OCONTENTS .AV>>)
+                           (<PUT .AV ,OCONTENTS (.W !<OCONTENTS .AV>)>
+                            <PUT .W ,OCAN .AV>)>)
+                    (<AND .CAN <N==? .CAN .B>>
+                     <TELL "The water leaks out of the " 1 <ODESC2 .CAN>
+                           " and evaporates immediately.">
+                     <COND (<MEMQ .W <AOBJS .ME>>
+                            <DROP-OBJECT .W .ME>)
+                           (<REMOVE-OBJECT .W>)>)
+                    (<MEMQ .B <AOBJS .ME>>
+                     <COND (<NOT <EMPTY? <OCONTENTS .B>>>
+                            <TELL "The bottle is already full.">)
+                           (<NOT <OOPEN? .B>>
+                            <TELL "The bottle is closed.">)
+                           (T
+                            <AND .REM <REMOVE-OBJECT .W>>
+                            <PUT .B ,OCONTENTS (.W)>
+                            <PUT .W ,OCAN .B>
+                            <TELL "The bottle is now full of water.">)>)
+                    (<AND <==? <OCAN .W> .B>
+                          <==? .PRSACT ,TAKE!-WORDS>
+                          <NOT .CAN>>
+                     <PUT .PRSVEC 2 .B>
+                     <TAKE T>
+                     <PUT .PRSVEC 2 .W>)
+                    (<TELL "The water slips through your fingers.">)>)
+             (<OR <==? .PRSACT ,DROP!-WORDS>
+                  <==? .PRSACT ,POUR!-WORDS>
+                  <==? .PRSACT ,GIVE!-WORDS>>
+              <COND (<MEMQ .W <AOBJS .ME>>
+                     <DROP-OBJECT .W .ME>)>
+              <COND (.AV
+                     <TELL "There is now a puddle in the bottom of the "
+                           1
+                           <ODESC2 .AV>
+                           ".">)
+                    (<TELL "The water spills to the floor and evaporates immediately.">
+                     <REMOVE-OBJECT .W>)>)
+             (<==? .PRSACT ,THROW!-WORDS>
+              <TELL "The water splashes on the walls, and evaporates immediately.">
+              <REMOVE-OBJECT .W>)>>
+
+<DEFINE ROPE-FUNCTION ("AUX" (PRSACT <1 ,PRSVEC>) (DROOM <FIND-ROOM "DOME">)
+                      (ROPE <FIND-OBJ "ROPE">) (WIN ,WINNER))
+  #DECL ((PRSACT) VERB (ROPE) OBJECT (WIN) ADV (DROOM) ROOM)
+  <COND (<N==? ,HERE .DROOM>
+        <SETG DOME-FLAG!-FLAG <>>
+        <COND (<==? <VNAME .PRSACT> TIE!-WORDS>
+               <TELL "There is nothing it can be tied to.">)
+              (<==? <VNAME .PRSACT> UNTIE!-WORDS>
+               <TELL "It is not tied to anything.">)>)
+       (<AND <==? <VNAME .PRSACT> TIE!-WORDS>
+             <==? <3 ,PRSVEC> <FIND-OBJ "RAILI">>>
+        <COND (,DOME-FLAG!-FLAG
+               <TELL "The rope is already attached.">)
+              (<TELL 
+"The rope drops over the side and comes within ten feet of the floor.">
+               <SETG DOME-FLAG!-FLAG T>
+               <TRO .ROPE ,NDESCBIT>
+               <COND (<NOT <OROOM .ROPE>>
+                      <PUT .WIN ,AOBJS <SPLICE-OUT .ROPE <AOBJS .WIN>>>
+                      <INSERT-OBJECT .ROPE .DROOM>)>)>)
+       (<==? <VNAME .PRSACT> UNTIE!-WORDS>
+        <COND (,DOME-FLAG!-FLAG
+               <SETG DOME-FLAG!-FLAG <>>
+               <TRZ .ROPE ,NDESCBIT>
+               <TELL 
+"Although you tied it incorrectly, the rope becomes free.">)
+              (<TELL "It is not tied to anything.">)>)
+       (<AND <==? .PRSACT ,DROP!-WORDS>
+             <NOT ,DOME-FLAG!-FLAG>>
+        <REMOVE-OBJECT .ROPE>
+        <INSERT-OBJECT .ROPE <FIND-ROOM "TORCH">>
+        <TELL "The rope drops gently to the floor below.">)
+       (<AND <==? .PRSACT ,TAKE!-WORDS>
+             ,DOME-FLAG!-FLAG
+             <TELL "The rope is tied to the railing.">>)>>
+
+<DEFINE CYCLOPS ("AUX" (PRSACT <1 ,PRSVEC>) (PRSOB1 <2 ,PRSVEC>) (RM ,HERE)
+                      (FOOD <FIND-OBJ "FOOD">) (DRINK <FIND-OBJ "WATER">)
+                      (COUNT <RVARS .RM>) (GARLIC <FIND-OBJ "GARLI">) CYC)
+       #DECL ((PRSACT) VERB (PRSOB1) <OR OBJECT FALSE> (RM) ROOM (FOOD DRINK) OBJECT
+              (CYC GARLIC) OBJECT (COUNT) FIX)
+       <COND (,CYCLOPS-FLAG!-FLAG
+              <COND (<OR <==? .PRSACT ,AWAKE!-WORDS>
+                         <==? .PRSACT ,MUNG!-WORDS>
+                         <==? .PRSACT ,BURN!-WORDS>
+                         <==? .PRSACT ,FIGHT!-WORDS>>
+                     <TELL
+"The cyclops yawns and stares at the thing that woke him up.">
+                     <SETG CYCLOPS-FLAG!-FLAG <>>
+                     <TRZ <SET CYC <FIND-OBJ "CYCLO">> ,SLEEPBIT>
+                     <TRO .CYC ,FIGHTBIT>
+                     <PUT .RM ,RVARS <ABS <RVARS .RM>>>
+                     T)>)
+             (<G? <ABS .COUNT> 5>
+              <JIGS-UP
+"The cyclops, tired of all of your games and trickery, eats you.
+The cyclops says 'Mmm.  Just like mom used to make 'em.'">)
+             (<==? <VNAME .PRSACT> GIVE!-WORDS>
+              <COND (<==? .PRSOB1 .FOOD>
+                     <COND (<G=? .COUNT 0>
+                            <REMOVE-OBJECT .FOOD>
+                            <TELL 
+"The cyclops says 'Mmm Mmm.  I love hot peppers!  But oh, could I use
+a drink.  Perhaps I could drink the blood of that thing'.  From the
+gleam in his eye, it could be surmised that you are 'that thing'.">
+                            <PUT .RM ,RVARS <MIN -1 <- .COUNT>>>)>)
+                    (<==? .PRSOB1 .DRINK>
+                     <COND (<L? .COUNT 0>
+                            <REMOVE-OBJECT .DRINK>
+                            <TRO <SET CYC <FIND-OBJ "CYCLO">> ,SLEEPBIT>
+                            <TRZ .CYC ,FIGHTBIT>
+                            <TELL 
+"The cyclops looks tired and quickly falls fast asleep (what did you
+put in that drink, anyway?).">
+                            <SETG CYCLOPS-FLAG!-FLAG T>)
+                           (<TELL 
+"The cyclops apparently was not thirsty at the time and refuses your
+generous gesture.">
+                            <>)>)
+                    (<==? .PRSOB1 .GARLIC>
+                     <TELL "The cyclops may be hungry, but there is a limit.">
+                     <PUT .RM ,RVARS <AOS-SOS .COUNT>>)
+                    (<TELL "The cyclops is not so stupid as to eat THAT!">
+                     <PUT .RM ,RVARS <AOS-SOS .COUNT>>)>)
+             (<OR <==? .PRSACT ,FIRST?!-WORDS>
+                  <==? .PRSACT ,FIGHT!-WORDS>> <>)
+             (<AND <PUT .RM ,RVARS <AOS-SOS .COUNT>> <>>)
+             (<OR <==? .PRSACT ,THROW!-WORDS>
+                  <==? <VNAME .PRSACT> MUNG!-WORDS>>
+              <COND (<PROB 50>
+                     <TELL
+
+"Your actions don't appear to be doing much harm to the cyclops, but
+they do not exactly lower your insurance premiums, either.">)
+                    (<TELL
+"The cyclops ignores all injury to his body with a shrug.">)>)
+             (<==? .PRSACT ,TAKE!-WORDS>
+              <TELL 
+"The cyclops is rather heavy and doesn't take kindly to being grabbed.">)
+             (<==? .PRSACT ,TIE!-WORDS>
+              <TELL
+"You cannot tie the cyclops, although he is fit to be tied.">)>>
+
+<DEFINE CYCLOPS-ROOM ("AUX" (PV ,PRSVEC) (RM ,HERE) (VARS <RVARS .RM>)) 
+       #DECL ((PV) VECTOR (RM) ROOM (VARS) FIX)
+       <COND (<==? <1 .PV> ,LOOK!-WORDS>
+              <TELL 
+"You are in a room with an exit on the west side, and a staircase
+leading up.">
+              <COND (<AND ,CYCLOPS-FLAG!-FLAG <NOT ,MAGIC-FLAG!-FLAG>>
+                     <TELL 
+"The cyclops, perhaps affected by a drug in your drink, is sleeping
+blissfully at the foot of the stairs.">)
+                    (,MAGIC-FLAG!-FLAG
+                     <TELL 
+"On the north of the room is a wall which used to be solid, but which
+now has a cyclops-sized hole in it.">)
+                    (<0? .VARS>
+                     <TELL 
+"A cyclops, who looks prepared to eat horses (much less mere
+adventurers), blocks the staircase.  From his state of health, and
+the bloodstains on the walls, you gather that he is not very
+friendly, though he likes people." 1>)
+                    (<G? .VARS 0>
+                     <TELL 
+"The cyclops is standing in the corner, eyeing you closely.  I don't
+think he likes you very much.  He looks extremely hungry even for a
+cyclops.">)
+                    (<L? .VARS 0>
+                     <TELL 
+"The cyclops, having eaten the hot peppers, appears to be gasping.
+His enflamed tongue protrudes from his man-sized mouth.">)>
+              <COND (,CYCLOPS-FLAG!-FLAG)
+                    (<OR <0? .VARS> <TELL <NTH ,CYCLOMAD <ABS .VARS>>>>)>)>>
+
+<PSETG CYCLOMAD
+      '["The cyclops seems somewhat agitated."
+       "The cyclops appears to be getting more agitated."
+       "The cyclops is moving about the room, looking for something."
+       
+"The cyclops was looking for salt and pepper.  I think he is gathering
+condiments for his upcoming snack."
+       "The cyclops is moving toward you in an unfriendly manner."
+       "You have two choices: 1. Leave  2. Become dinner."]>
+
+<GDECL (CYCLOMAD) <VECTOR [REST STRING]>>
+
+<DEFINE AOS-SOS (FOO)
+  #DECL ((FOO) FIX)
+  <COND (<L? .FOO 0> <SET FOO <- .FOO 1>>)
+       (<SET FOO <+ .FOO 1>>)>
+  <COND (,CYCLOPS-FLAG!-FLAG)
+       (<TELL <NTH ,CYCLOMAD <ABS .FOO>>>)>
+  .FOO>
+
+<SETG ECHO-FLAG!-FLAG <>>
+
+<DEFINE ECHO-ROOM ("AUX" (READER-STRING ,READER-STRING)
+                  (B ,INBUF) L (RM <FIND-ROOM "ECHO">) (OUTCHAN ,OUTCHAN)
+                  VERB (WALK ,WALK!-WORDS)) 
+       #DECL ((OUTCHAN) CHANNEL (WALK VERB) VERB
+              (READER-STRING) STRING (PRSACT) VERB (B) STRING (L) FIX (RM) ROOM)
+       <COND (,ECHO-FLAG!-FLAG)
+             (<UNWIND
+               <PROG ()
+                <MAPF <>
+                  <FUNCTION (OBJ) #DECL ((OBJ) OBJECT)
+                    <COND (<OVIS? .OBJ>
+                           <TRO .OBJ ,ECHO-ROOM-BIT>
+                           <TRZ .OBJ ,OVISON>)>>
+                  <ROBJS .RM>>
+               <REPEAT ((PRSVEC ,PRSVEC) RANDOM-ACTION)
+                      #DECL ((PRSVEC) VECTOR)
+                      <SET L
+                           <READSTRING .B
+                                       ,INCHAN
+                                       .READER-STRING>>
+                      <READCHR ,INCHAN>
+                      <OR ,ALT-FLAG <READCHR ,INCHAN>>
+                      <SETG MOVES <+ ,MOVES 1>>
+                      <COND (<AND <EPARSE <LEX .B <REST .B .L> T> T>
+                                  <==? <SET VERB <1 .PRSVEC>> .WALK>
+                                  <2 .PRSVEC>
+                                  <MEMQ <CHTYPE <2 .PRSVEC> ATOM>
+                                        <REXITS .RM>>>
+                             <SET RANDOM-ACTION <VFCN .VERB>>
+                             <APPLY-RANDOM .RANDOM-ACTION>
+                             <COND (<N==? ,HERE .RM>
+                                    <MAPF <>
+                                      <FUNCTION (X) #DECL ((X) OBJECT)
+                                        <COND (<TRNN .X ,ECHO-ROOM-BIT>
+                                               <TRZ .X ,ECHO-ROOM-BIT>
+                                               <TRO .X ,OVISON>)>>
+                                      <ROBJS .RM>>)>
+                             <RETURN T>)
+                            (<PRINTSTRING .B .OUTCHAN .L>
+                             <SETG TELL-FLAG T>
+                             <CRLF>
+                             <COND (<==? <MEMBER "ECHO" <UPPERCASE .B>> .B>
+                                    <TELL "The acoustics of the room change subtly."
+                                          1>
+                                    <SETG ECHO-FLAG!-FLAG T>
+                                    <MAPF <>
+                                          <FUNCTION (X) #DECL ((X) OBJECT)
+                                                    <COND (<TRNN .X ,ECHO-ROOM-BIT>
+                                                           <TRZ .X ,ECHO-ROOM-BIT>
+                                                           <TRO .X ,OVISON>)>>
+                                          <ROBJS .RM>>
+                                    <RETURN T>)>)>>>
+               <PROG ()
+                     <GOTO <FIND-ROOM "CHAS3">>
+                     <SETG MOVES <+ ,MOVES 1>>
+                     <MAPF <>
+                           <FUNCTION (X) #DECL ((X) OBJECT)
+                             <COND (<TRNN .X ,ECHO-ROOM-BIT>
+                                    <TRZ .X ,ECHO-ROOM-BIT>
+                                    <TRO .X ,OVISON>)>>
+                           <ROBJS .RM>>>>)>>
+
+<DEFINE LEAPER ("AUX" (RM ,HERE) (EXITS <REXITS .RM>) M)
+   #DECL ((RM) ROOM (EXITS) EXIT (M) <OR <PRIMTYPE VECTOR> FALSE>)
+   <COND (<SET M <MEMQ DOWN!-WORDS .EXITS>>
+         <COND (<OR <TYPE? <2 .M> NEXIT>
+                    <AND <TYPE? <2 .M> CEXIT>
+                         <NOT <CXFLAG <2 .M>>>>>
+                <JIGS-UP <PICK-ONE ,JUMPLOSS>>)>)
+        (<TELL <PICK-ONE ,WHEEEEE>>)>>
+
+<DEFINE SKIPPER ()
+    <TELL <PICK-ONE ,WHEEEEE>>>
+
+<SETG HS 0>
+<GDECL (HS) FIX>
+<DEFINE HELLO ("AUX" (PRSOBJ <2 ,PRSVEC>) (AMT <SETG HS <+ ,HS 1>>))
+    #DECL ((PRSOBJ) <OR OBJECT FALSE> (AMT) FIX)
+    <COND (.PRSOBJ
+          <COND (<==? .PRSOBJ <FIND-OBJ "SAILO">>
+                 <COND (<0? <MOD .AMT 20>>
+                        <TELL
+"You seem to be repeating yourself.">)
+                       (<0? <MOD .AMT 10>>
+                        <TELL
+"I think that phrase is getting a bit worn out.">)
+                       (<TELL 
+"Nothing happens here.">)>)
+                (<==? .PRSOBJ <FIND-OBJ "AVIAT">>
+                 <TELL "Here, nothing happens.">)
+                (<TELL
+"I think that only schizophrenics say 'Hello' to a " 1 <ODESC2 .PRSOBJ> ".">)>)
+         (<TELL <PICK-ONE ,HELLOS>>)>>
+
+<PSETG HELLOS
+      '["Hello."
+       "Good day."
+       "Nice weather we've been having lately"
+       "How are you?"
+       "Goodbye."]>
+
+<PSETG WHEEEEE
+      '["Very good.  Now you can go to the second grade."
+       "Have you tried hopping around the dungeon, too?"
+       "Are you enjoying yourself?"
+       "Wheeeeeeeeee!!!!!"
+       "Do you expect me to applaud?"]>
+
+<PSETG JUMPLOSS
+      '["You should have looked before you leaped."
+       "I'm afraid that leap was a bit much for your weak frame."
+       "In the movies, your life would be passing in front of your eyes."
+       "Geronimo....."]>
+
+<GDECL (HELLOS WHEEEEE JUMPLOSS) <VECTOR [REST STRING]>>
+
+<DEFINE READER ("AUX" (PV ,PRSVEC) (PO <2 .PV>) (PI <3 .PV>))
+    #DECL ((PV) VECTOR (PO) OBJECT (PI) <OR FALSE OBJECT>)
+    <COND (<NOT <LIT? ,HERE>>
+          <TELL "It is impossible to read in the dark.">)
+         (<AND .PI <NOT <TRANSPARENT? .PI>>>
+          <TELL "How does one look through a " 1 <ODESC2 .PI> "?">)
+         (<NOT <READABLE? .PO>>
+          <TELL "How can I read a " 1 <ODESC2 .PO> "?">)
+         (<OBJECT-ACTION>)
+         (<TELL <OREAD .PO>>)>>
+         
+<DEFINE WELL ()
+    <COND (,RIDDLE-FLAG!-FLAG <TELL "Well what?">)
+         (<==? ,HERE <FIND-ROOM "RIDDL">>
+          <SETG RIDDLE-FLAG!-FLAG T>
+          <TELL
+"There is a clap of thunder and the east door opens.">)
+         (<TELL "Well what?">)>>
+
+<DEFINE SINBAD ()
+    <COND (<AND <==? ,HERE <FIND-ROOM "CYCLO">>
+               <MEMQ <FIND-OBJ "CYCLO"> <ROBJS ,HERE>>>
+          <SETG CYCLOPS-FLAG!-FLAG T>
+          <TELL
+"The cyclops, hearing the name of his deadly nemesis, flees the room
+by knocking down the wall on the north of the room.">
+          <SETG MAGIC-FLAG!-FLAG T>
+          <REMOVE-OBJECT <FIND-OBJ "CYCLO">>)
+         (<TELL 
+"Wasn't he a sailor?">)>>
+
+<DEFINE GRANITE ()
+    <TELL "I think you are taking this thing for granite.">>
+
+<PSETG DUMMY
+      '["Look around."
+       "You think it isn't?"
+       "I think you've already done that."]>
+
+<GDECL (DUMMY) <VECTOR [REST STRING]>>
+
+<DEFINE BRUSH ("AUX" (PRSO <2 ,PRSVEC>) (PRSI <3 ,PRSVEC>))
+    #DECL ((PRSO) OBJECT (PRSI) <OR OBJECT FALSE>)
+    <COND (<==? .PRSO <FIND-OBJ "TEETH">>
+          <COND (<AND <==? .PRSI <FIND-OBJ "PUTTY">>
+                      <MEMQ .PRSI <AOBJS ,WINNER>>>
+                 <JIGS-UP
+"Well, you seem to have been brushing your teeth with some sort of
+glue. As a result, your mouth gets glued together (with your nose)
+and you die of respiratory failure.">)
+                (<NOT .PRSI>
+                 <TELL
+"Dental hygiene is highly recommended, but I'm not sure what you want
+to brush them with.">)
+                (<TELL
+"A nice idea, but with a " 1 <ODESC2 .PRSI> "?">)>)
+         (<TELL
+"If you wish, but I can't understand why??">)>>
+
+<DEFINE RING ("AUX" (PRSOBJ <2 ,PRSVEC>))
+    #DECL ((PRSOBJ) <OR OBJECT FALSE>)
+    <COND (<==? .PRSOBJ <FIND-OBJ "BELL">>
+          <TELL
+"Ding, dong.">)
+         (<TELL
+"How, exactly, can I ring that?">)>>
+
+<DEFINE EAT ("AUX" (PRSVEC ,PRSVEC) (EAT? <>) (DRINK? <>) (PRSOBJ <2 .PRSVEC>)
+            NOBJ (AOBJS <AOBJS ,WINNER>))
+    #DECL ((PRSOBJ) OBJECT (NOBJ) <OR OBJECT FALSE> (PRSVEC) <VECTOR [3 ANY]>
+          (AOBJS) <LIST [REST OBJECT]> (EAT? DRINK?) <OR ATOM FALSE>)
+    <COND (<OBJECT-ACTION>)
+         (<AND <SET EAT? <EDIBLE? .PRSOBJ>> <MEMQ .PRSOBJ .AOBJS>>
+          <COND (<==? <1 .PRSVEC> ,DRINK!-WORDS>
+                 <TELL "How can I drink that?">)
+                (<TELL
+"Thank you very much.  It really hit the spot.">
+                 <PUT ,WINNER ,AOBJS <SPLICE-OUT .PRSOBJ .AOBJS>>)>)
+         (<AND <SET DRINK? <DRINKABLE? .PRSOBJ>>
+               <SET NOBJ <OCAN .PRSOBJ>>
+               <MEMQ .NOBJ .AOBJS>>
+          <COND (<OOPEN? .NOBJ>
+                 <TELL
+"Thank you very much.  I was rather thirsty (from all this talking,
+probably).">)
+                (T
+                 <TELL
+"I'd like to, but I can't get to it.">)>
+          <PUT .PRSOBJ ,OCAN <>>
+          <PUT .NOBJ ,OCONTENTS <SPLICE-OUT .PRSOBJ <OCONTENTS .NOBJ>>>)
+         (<NOT <OR .EAT? .DRINK?>>
+          <TELL
+"I don't think that the " 1 <ODESC2 .PRSOBJ> " would agree with you.">)
+         (<TELL
+"I think you should get that first.">)>>
+
+<DEFINE JARGON ()
+    <TELL "Well, FOO, BAR, and BLETCH to you too!">>
+
+<DEFINE CURSES ()
+    <TELL <PICK-ONE ,OFFENDED>>>
+
+<PSETG OFFENDED 
+  '["Such language in a high-class establishment like this!"
+    "You ought to be ashamed of yourself."
+    "Its not so bad.  You could have been killed already."
+    "Tough shit, asshole."
+    "Oh, dear.  Such language from a supposed winning adventurer!"]>
+
+<GDECL (OFFENDED) <VECTOR [REST STRING]>>
+
+"ROBBER"
+
+<DEFINE ROBBER ROBBER (HACK
+                      "AUX" (RM <HROOM .HACK>) ROBJ
+                            (SEEN? <RSEEN? .RM>) (WIN ,WINNER) (WROOM ,HERE)
+                            (HOBJ <HOBJ .HACK>) (STILL <FIND-OBJ "STILL">) 
+                            HERE? (HH <HOBJS .HACK>) (TREAS <FIND-ROOM "TREAS">))
+   #DECL ((HACK) HACK (RM WROOM) ROOM (ROBJ HH) <LIST [REST OBJECT]>
+         (SEEN?) <OR ATOM FALSE> (WIN) ADV (HOBJ) OBJECT (ROBBER) ACTIVATION
+         (HERE?) <OR ROOM FALSE> (STILL) OBJECT (TREAS) ROOM)
+   <PROG ((ONCE <>) OBJT)
+     #DECL ((ONCE) <OR ATOM FALSE> (OBJT) <LIST [REST OBJECT]>)
+     <COND (<SET HERE? <OROOM .HOBJ>>
+           <SET RM .HERE?>)>
+     <SET ROBJ <ROBJS .RM>>
+     <SET OBJT .HH>
+     <COND
+      (<AND <==? .RM .TREAS>
+           <N==? .RM .WROOM>>
+       <COND (.HERE?
+             <COND (<==? <OROOM .STILL> .TREAS>
+                    <SNARF-OBJECT .HOBJ .STILL>)>
+             <REMOVE-OBJECT .HOBJ>
+             <SET HERE? <>>)>
+       <MAPF <>
+            <FUNCTION (X) 
+                    #DECL ((X) OBJECT)
+                    <COND (<G? <OTVAL .X> 0>
+                           <PUT .HACK ,HOBJS <SET HH <SPLICE-OUT .X .HH>>>
+                           <INSERT-OBJECT .X .RM>)>>
+            .HH>)
+      (<==? .RM .WROOM>                 ;"Adventurer is in room:  CHOMP, CHOMP"
+       <COND
+       (<==? .RM .TREAS>)      ; "Don't move, Gertrude"
+        (<NOT <HFLAG .HACK>>
+         <COND (<AND <NOT .HERE?> <PROB 30>>
+               <COND (<==? <OCAN .STILL> .HOBJ>
+                      <INSERT-OBJECT .HOBJ .RM>
+                      <TELL 
+"Someone carrying a large bag is casually leaning against one of the
+walls here.  He does not speak, but it is clear from his aspect that
+the bag will be taken only over his dead body.">
+                      <PUT .HACK ,HFLAG T>
+                      <RETURN T .ROBBER>)>)
+              (<AND .HERE?
+                    <FIGHTING? .HOBJ>
+                    <COND (<NOT <WINNING? .HOBJ .WIN>>
+                           <TELL
+"Your opponent, determining discretion to be the better part of
+valor, decides to terminate this little contretemps.  With a rueful
+nod of his head, he steps backward into the gloom and disappears.">
+                           <REMOVE-OBJECT .HOBJ>
+                           <TRZ .HOBJ ,FIGHTING>
+                           <SNARF-OBJECT .HOBJ .STILL>
+                           <RETURN T .ROBBER>)
+                          (<PROB 90>)>>)
+              (<AND .HERE? <PROB 30>>
+               <TELL 
+
+"The holder of the large bag just left, looking disgusted. 
+Fortunately, he took nothing.">
+               <REMOVE-OBJECT .HOBJ>
+               <SNARF-OBJECT .HOBJ .STILL>
+               <RETURN T .ROBBER>)
+              (<PROB 70> <RETURN T .ROBBER>)
+              (T
+               <COND (<MEMQ .STILL <HOBJS .HACK>>
+                      <PUT .HACK ,HOBJS <SPLICE-OUT .STILL <HOBJS .HACK>>>
+                      <PUT .HOBJ ,OCONTENTS (.STILL)>
+                      <PUT .STILL ,OCAN .HOBJ>)>
+               <PUT .HACK ,HOBJS <SET HH <ROB-ROOM .RM .HH 100>>>
+               <PUT .HACK ,HOBJS <SET HH <ROB-ADV .WIN .HH>>>
+               <PUT .HACK ,HFLAG T>
+               <COND (<AND <N==? .OBJT .HH> <NOT .HERE?>>
+                      <TELL 
+"A seedy-looking individual with a large bag just wandered through
+the room.  On the way through, he quietly abstracted all valuables
+from the room and from your possession, mumbling something about
+\"Doing unto others before..\"">)
+                     (.HERE?
+                      <SNARF-OBJECT .HOBJ .STILL>
+                      <COND (<N==? .OBJT .HH>
+                             <TELL 
+"The other occupant just left, still carrying his large bag.  You may
+not have noticed that he robbed you blind first.">)
+                            (<TELL 
+"The other occupant (he of the large bag), finding nothing of value,
+left disgusted.">)>
+                      <REMOVE-OBJECT .HOBJ>
+                      <SET HERE? <>>)
+                     (T
+                      <TELL 
+
+"A 'lean and hungry' gentleman just wandered through.  Finding
+nothing of value, he left disgruntled.">)>)>)
+       (T
+        <COND (.HERE?                  ;"Here, already announced."
+               <COND (<PROB 30>
+                      <PUT .HACK ,HOBJS <SET HH <ROB-ROOM .RM .HH 100>>>
+                      <PUT .HACK ,HOBJS <SET HH <ROB-ADV .WIN .HH>>>
+                      <COND (<MEMQ <FIND-OBJ "ROPE"> .HH>
+                             <SETG DOME-FLAG!-FLAG <>>)>
+                      <COND (<==? .OBJT .HH>
+                             <TELL
+"The other occupant (he of the large bag), finding nothing of value,
+left disgusted.">)
+                            (T
+                             <TELL
+"The other occupant just left, still carrying his large bag.  You may
+not have noticed that he robbed you blind first.">)>
+                      <REMOVE-OBJECT .HOBJ>
+                      <SET HERE? <>>
+                      <SNARF-OBJECT .HOBJ .STILL>)
+                     (<RETURN T .ROBBER>)>)>)>)
+      (<AND <MEMQ .HOBJ <ROBJS .RM>>   ;"Leave if victim left"
+           <SNARF-OBJECT .HOBJ .STILL>
+           <REMOVE-OBJECT .HOBJ>
+           <SET HERE? <>>>)
+      (<AND <==? <OROOM .STILL> .RM>
+           <SNARF-OBJECT .HOBJ .STILL>
+           <>>)
+      (.SEEN?                               ;"Hack the adventurer's belongings"
+       <PUT .HACK ,HOBJS <SET HH <ROB-ROOM .RM .HH 75>>>
+       <COND
+       (<AND <==? <RDESC2 .RM> ,MAZEDESC> <==? <RDESC2 .WROOM> ,MAZEDESC>>
+        <MAPF <>
+              <FUNCTION (X) 
+                      #DECL ((X) OBJECT)
+                      <COND (<AND <CAN-TAKE? .X> <OVIS? .X> <PROB 40>>
+                             <TELL 
+"You hear, off in the distance, someone saying \"My, I wonder what
+this fine "                  3 <ODESC2 .X> " is doing here.\"">
+                             <TELL "" 1>
+                             <COND (<PROB 60>
+                                    <REMOVE-OBJECT .X>
+                                    <PUT .X ,OTOUCH? T>
+                                    <PUT .HACK ,HOBJS <SET HH (.X !.HH)>>)>
+                             <MAPLEAVE>)>>
+              <ROBJS .RM>>)
+       (<MAPF <>
+              <FUNCTION (X) 
+                      #DECL ((X) OBJECT)
+                      <COND (<AND <0? <OTVAL .X>> <CAN-TAKE? .X> <OVIS? .X> <PROB 20>>
+                             <REMOVE-OBJECT .X>
+                             <PUT .X ,OTOUCH? T>
+                             <PUT .HACK ,HOBJS <SET HH (.X !.HH)>>
+                             <COND (<==? .RM .WROOM>
+                                    <TELL "You suddenly notice that the "
+                                          1
+                                          <ODESC2 .X>
+                                          " vanished.">)>
+                             <MAPLEAVE>)>>
+              <ROBJS .RM>>
+        <COND (<MEMQ <FIND-OBJ "ROPE"> .HH>
+               <SETG DOME-FLAG!-FLAG <>>)>)>)>
+     <COND (<SET ONCE <NOT .ONCE>>              ;"Move to next room, and hack."
+           <PROG ((ROOMS <HROOMS .HACK>))
+             <SET RM <1 .ROOMS>>
+             <COND (<EMPTY? <SET ROOMS <REST .ROOMS>>>
+                    <SET ROOMS ,ROOMS>)>
+             <COND (<RTRNN .RM ,RSACREDBIT>    ;"Can I work here?"
+                    <AGAIN>)>
+             <PUT .HACK ,HROOM .RM>
+             <PUT .HACK ,HFLAG <>>
+             <PUT .HACK ,HROOMS .ROOMS>
+             <SET SEEN? <RSEEN? .RM>>>
+           <AGAIN>)>>                        ;"Drop worthless cruft, sometimes"
+   <OR <==? .RM .TREAS>
+       <MAPF <>
+            <FUNCTION (X) 
+                    #DECL ((X) OBJECT)
+                    <COND (<AND <0? <OTVAL .X>> <PROB 30>>
+                           <PUT .HACK ,HOBJS <SET HH <SPLICE-OUT .X .HH>>>
+                           <INSERT-OBJECT .X .RM>
+                           <AND <==? .RM .WROOM>
+                                <TELL 
+"The robber, rummaging through his bag, dropped a few items he found
+valueless." >>)>>
+             .HH>>>
+
+<DEFINE SNARF-OBJECT (WHO WHAT)
+       #DECL ((WHO WHAT) OBJECT)
+       <COND (<AND <N==? <OCAN .WHAT> .WHO>
+                   <OR <OROOM .WHAT>
+                       <OCAN .WHAT>>>
+              <REMOVE-OBJECT .WHAT>
+