Replace magic MINTRS/MAXTRS with a treasure attribute in YAML.
[open-adventure.git] / adventure.yaml
index bc6e0e2cf8b5e4d0b16c21c2594c8dbc684abfa3..60177932c5514b59a0795ff6ec2730d922c344d7 100644 (file)
@@ -1,4 +1,4 @@
-# This YAML file gets processed into a collection of data structure and
+# This YAML file gets processed into a collection of data structures and
 # variable initializers describing Colossal Cave.  It replaces an ad-hoc
 # text database shipped with Adventure versions up to 2.5.  The format
 # change enabled a lot of use of symbolic names where there were previously
@@ -6,10 +6,19 @@
 #
 # We define a bunch of YAML structures:
 #
-# locations: Each item contains a long and short description.  Some
-#    short descriptions are empty.  Order of these locations is significant;
-#    see the macros OUTSID and INDEEP.  Location conditions can be read
-#    as follows:
+# hints: Each item contains a hint number (add 10 to get cond bit),
+#    a hint label (used to generate the value macro for the hint) 
+#    the number of turns he must be at the right loc(s) before
+#    triggering the hint, the points deducted for taking the hint, the
+#    message number (section 6) of the question, and the message
+#    number of the hint.  These values are stashed in the "hints"
+#    array.
+#
+# locations: They have attributes as follows...
+#
+#    long:         Long description, always shown on first encounter.
+#    short:        Short description. If none, use long description.
+#    conditions:   A dictionary of attributes
 #        LIT           Light
 #        OILY          If FLUID flag is on: true for oil, false for water
 #        FLUID         Liquid asset
 #        HWOODS                Lost in forest
 #        HOGRE         Trying to deal with ogre
 #        HJADE         Found all treasures except jade
+#    hints:        A list of YAML references to hints that may be available at
+#                  this location. (This is why locations has to follow hints.)
+#    sound:        Label for a location sound.
+#    loud:         If true, object sounds are drowned out at this location.
 #
-# arbitrary_messages: These are arguments to RSPEAK(). Some spans of
-#    these messages need to be kept adjacent and ordered.  To see which,
-#    grep for RSPEAK calls containing expressions with arithmetic.
+#    All attributes are optional except the long description. Order of
+#    locations is not significant.
+#
+# arbitrary_messages: These are arguments to rspeak(). Some spans of
+#    these messages need to be kept adjacent and ordered (for now).
+#    To see which, grep for rspeak() calls containing expressions with
+#    arithmetic.  Eventually, these will be pulled out into more appropriate
+#    data structures. Then ordering can be dropped, and gaps removed.
 #
 # classes: Each item contains a point threshold and a message
-#    describing a classification of player.  point thresholds must be
+#    describing a classification of player.  Point thresholds must be
 #    in ascending order. The scoring code selects the appropriate
 #    message, where each message is considered to apply to players
 #    whose scores are higher than the previous N but not higher than
 #    modification (and particularly expansion) of the program.
 #
 # turn_thresholds:  Each item contains a number and a message
-#    berating the player for taking so many turns.  The messages must
-#    be in the proper (ascending) order.  The message gets printed if
-#    the player exceeds N % 100000 turns, at which time N/100000
-#    points get deducted from his score.
+#    berating the player for taking so many turns.  When the turn count
+#    matches one of the thresholds, the corresponding message is shown.
+#    Order doesn't matter; the logic simply tests every threshold on
+#    the assumption that turn counts never decrease nor skip values.
 #
 # objects: Each item contains a description for use in the inventory command
 #    and one or more messages describing the object in different states.
-#    If the inventory desription begins with "*" the object is dungeon
-#    furniture that cannot be taken or carried.
+#    There is also a boolean "treasure" attribute, deaykting to false.
+#    If a state message is a tuple then the first element is made the name
+#    of a #define viible to the code for the associayed state, numbered
+#    from zero upwards. If the inventory desription begins with "*" the
+#    object is dungeon furniture that cannot be taken or carried.
 #
 # obituaries: Death messages and reincarnation queries.  Order is
 #    significant, they're used in succession as the player racks up
 #    deaths.
 #
-# hints: Each item contains a hint number (add 10 to get cond bit),
-#    the number of turns he must be at the right loc(s) before
-#    triggering the hint, the points deducted for taking the hint, the
-#    message number (section 6) of the question, and the message
-#    number of the hint.  These values are stashed in the "hints"
-#    array.
-#
-# These correspond to sections 1, 2, 5, 6, 10, 11, and 14 in the old
-# adventure.text format.  Sections 3, 4, 7, 8, and 9 haven't moved yet.
+# These correspond to sections 1, 2, 5, 6, 9, 10, 11, 13, and 14 in the old
+# adventure.text format.  Sections 3, 4, 7, and 8 haven't moved yet.
 # Section 12 was obsolete.
 
+# FIXME: Hint texts shouldn't be in arbitrary_messages, but inlined here
+hints:
+  - hint: &grate
+      name: CAVE
+      number: 1
+      turns: 4
+      penalty: 2
+      question: ENTRY_QUERY
+      hint: HARD_GRATE
+  - hint: &bird
+      name: BIRD
+      number: 2
+      turns: 5
+      penalty: 2
+      question: BIRD_QUERY
+      hint: SKITTISH_BIRD
+  - hint: &snake
+      name: SNAKE
+      number: 3
+      turns: 8
+      penalty: 2
+      question: SNAKE_QUERY
+      hint: SNAKE_HINT
+  - hint: &maze
+      name: MAZE
+      number: 4
+      turns: 75
+      penalty: 4
+      question: MAZE_HELP
+      hint: DROP_THINGS
+  - hint: &dark
+      name: DARK
+      number: 5
+      turns: 25
+      penalty: 5
+      question: PLOVER_QUERY
+      hint: EXPLORE_HINT
+  - hint: &witt
+      name: WITT
+      number: 6
+      turns: 20
+      penalty: 3
+      question: HELP_LEAVING
+      hint: NOGO_WEST
+  - hint: &urn
+      name: CLIFF
+      number: 7
+      turns: 8
+      penalty: 2
+      question: WONDERING_QUERY
+      hint: ADVANCED_SECTION
+  - hint: &forest
+      name: WOODS
+      number: 8
+      turns: 25
+      penalty: 2
+      question: FOREST_QUERY
+      hint: GO_EAST
+  - hint: &ogre
+      name: OGRE
+      number: 9
+      turns: 10
+      penalty: 4
+      question: OGRE_QUERY
+      hint: OGRE_CLUE
+  - hint: &jade
+      name: JADE
+      number: 10
+      turns: 1
+      penalty: 4
+      question: MISSING_ONE
+      hint: NO_LOCATE
+
 locations: !!omap
 - LOC_NOWHERE:
     description:
@@ -75,6 +162,7 @@ locations: !!omap
       long: 'You are standing at the end of a road before a small brick building.\nAround you is a forest.  A small stream flows out of the building and\ndown a gully.'
       short: 'You''re in front of building.'
     conditions: {FLUID: true, ABOVE: true, LIT: true}
+    sound: STREAM_GURGLES
 - LOC_HILL:
     description:
       long: 'You have walked up a hill, still in the forest.  The road slopes back\ndown the other side of the hill.  There is a building in the distance.'
@@ -85,11 +173,13 @@ locations: !!omap
       long: 'You are inside a building, a well house for a large spring.'
       short: 'You''re inside building.'
     conditions: {FLUID: true, ABOVE: true, LIT: true}
+    sound: STREAM_GURGLES
 - LOC_VALLEY:
     description:
       long: 'You are in a valley in the forest beside a stream tumbling along a\nrocky bed.'
       short: 'You''re in valley.'
     conditions: {FLUID: true, ABOVE: true, LIT: true}
+    sound: STREAM_GURGLES
 - LOC_ROADEND:
     description:
       long: 'The road, which approaches from the east, ends here amid the trees.'
@@ -99,17 +189,20 @@ locations: !!omap
     description:
       long: 'The forest thins out here to reveal a steep cliff.  There is no way\ndown, but a small ledge can be seen to the west across the chasm.'
       short: 'You''re at cliff.'
-    conditions: {HCLIFF: true, ABOVE: true, NOBACK: true, LIT: true}
+    conditions: {ABOVE: true, NOBACK: true, LIT: true}
+    hints: [*urn]
 - LOC_SLIT:
     description:
       long: 'At your feet all the water of the stream splashes into a 2-inch slit\nin the rock.  Downstream the streambed is bare rock.'
       short: 'You''re at slit in streambed.'
     conditions: {FLUID: true, ABOVE: true, LIT: true}
+    sound: STREAM_GURGLES
 - LOC_GRATE:
     description:
       long: 'You are in a 20-foot depression floored with bare dirt.  Set into the\ndirt is a strong steel grate mounted in concrete.  A dry streambed\nleads into the depression.'
       short: 'You''re outside grate.'
-    conditions: {HJADE: true, ABOVE: true, HCAVE: true, LIT: true}
+    conditions: {ABOVE: true, LIT: true}
+    hints: [*grate, *jade]
 - LOC_BELOWGRATE:
     description:
       long: 'You are in a small chamber beneath a 3x3 steel grate to the surface.\nA low crawl over cobbles leads inward to the west.'
@@ -134,7 +227,8 @@ locations: !!omap
     description:
       long: 'You are in a splendid chamber thirty feet high.  The walls are frozen\nrivers of orange stone.  An awkward canyon and a good passage exit\nfrom east and west sides of the chamber.'
       short: 'You''re in bird chamber.'
-    conditions: {HBIRD: true}
+    conditions: {}
+    hints: [*bird] 
 - LOC_PITTOP:
     description:
       long: 'At your feet is a small pit breathing traces of white mist.  An east\npassage ends here except for a small crack leading on.'
@@ -144,7 +238,9 @@ locations: !!omap
     description:
       long: 'You are at one end of a vast hall stretching forward out of sight to\nthe west.  There are openings to either side.  Nearby, a wide stone\nstaircase leads downward.  The hall is filled with wisps of white mist\nswaying to and fro almost as if alive.  A cold wind blows up the\nstaircase.  There is a passage at the top of a dome behind you.'
       short: 'You''re in Hall of Mists.'
-    conditions: {HJADE: true}
+    conditions: {DEEP: true}
+    hints: [*jade]
+    sound: WIND_WHISTLES
 - LOC_CRACK:
     description:
       long: 'The crack is far too small for you to follow.  At its widest it is\nbarely wide enough to admit your foot.'
@@ -164,7 +260,8 @@ locations: !!omap
     description:
       long: 'You are in the Hall of the Mountain King, with passages off in all\ndirections.'
       short: 'You''re in Hall of Mt King.'
-    conditions: {DEEP: true, HSNAKE: true}
+    conditions: {DEEP: true}
+    hints: [*snake]
 - LOC_NECKBROKE:
     description:
       long: 'You are at the bottom of the pit with a broken neck.'
@@ -260,6 +357,7 @@ locations: !!omap
       long: 'You are in the bottom of a small pit with a little stream, which\nenters and exits through tiny slits.'
       short: 'You''re at bottom of pit with stream.'
     conditions: {FLUID: true, DEEP: true}
+    sound: STREAM_GURGLES
 - LOC_DUSTY:
     description:
       long: 'You are in a large room full of dusty rocks.  There is a big hole in\nthe floor.  There are cracks everywhere, and a passage leading east.'
@@ -279,77 +377,92 @@ locations: !!omap
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_ALIKE2:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_ALIKE3:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_ALIKE4:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_DEADEND1:
     description:
       long: 'Dead end'
       short: !!null
-    conditions: {DEEP: true, NOARRR: true, HMAZE: true}
+    conditions: {DEEP: true, NOARRR: true}
+    hints: [*maze]
 - LOC_DEADEND2:
     description:
       long: 'Dead end'
       short: !!null
-    conditions: {DEEP: true, NOARRR: true, HMAZE: true}
+    conditions: {DEEP: true, NOARRR: true}
+    hints: [*maze]
 - LOC_DEADEND3:
     description:
       long: 'Dead end'
       short: !!null
-    conditions: {DEEP: true, NOARRR: true, HMAZE: true}
+    conditions: {DEEP: true, NOARRR: true}
+    hints: [*maze]
 - LOC_ALIKE5:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_ALIKE6:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_ALIKE7:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_ALIKE8:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_ALIKE9:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_DEADEND4:
     description:
       long: 'Dead end'
       short: !!null
-    conditions: {DEEP: true, NOARRR: true, HMAZE: true}
+    conditions: {DEEP: true, NOARRR: true}
+    hints: [*maze]
 - LOC_ALIKE10:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_DEADEND5:
     description:
       long: 'Dead end'
       short: !!null
-    conditions: {DEEP: true, NOARRR: true, HMAZE: true}
+    conditions: {DEEP: true, NOARRR: true}
+    hints: [*maze]
 - LOC_PITBRINK:
     description:
       long: 'You are on the brink of a thirty foot pit with a massive orange column\ndown one wall.  You could climb down here but you could not get back\nup.  The maze continues at this level.'
@@ -389,7 +502,9 @@ locations: !!omap
     description:
       long: 'You are at a complex junction.  A low hands and knees passage from the\nnorth joins a higher crawl from the east to make a walking passage\ngoing west.  There is also a large room above.  The air is damp here.'
       short: 'You''re at complex junction.'
-    conditions: {DEEP: true, HJADE: true}
+    conditions: {DEEP: true}
+    hints: [*jade]
+    sound: WIND_WHISTLES
 - LOC_BEDQUILT:
     description:
       long: 'You are in Bedquilt, a long east/west passage with holes everywhere.\nTo explore at random select north, south, up, or down.'
@@ -469,17 +584,20 @@ locations: !!omap
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_DEADEND8:
     description:
       long: 'Dead end'
       short: !!null
-    conditions: {DEEP: true, HMAZE: true}
+    conditions: {DEEP: true}
+    hints: [*maze]
 - LOC_DEADEND9:
     description:
       long: 'Dead end'
       short: !!null
-    conditions: {DEEP: true, NOARRR: true, HMAZE: true}
+    conditions: {DEEP: true, NOARRR: true}
+    hints: [*maze]
 - LOC_ALIKE12:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
@@ -499,12 +617,14 @@ locations: !!omap
     description:
       long: 'Dead end'
       short: !!null
-    conditions: {DEEP: true, NOARRR: true, HMAZE: true}
+    conditions: {DEEP: true, NOARRR: true}
+    hints: [*maze]
 - LOC_ALIKE14:
     description:
       long: 'You are in a maze of twisty little passages, all alike.'
       short: !!null
-    conditions: {DEEP: true, NOBACK: true, HMAZE: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*maze]
 - LOC_NARROW:
     description:
       long: 'You are in a long, narrow corridor stretching out of sight to the\nwest.  At the eastern end is a hole through which you can see a\nprofusion of leaves.'
@@ -540,11 +660,13 @@ locations: !!omap
       long: 'You are at one end of an immense north/south passage.'
       short: !!null
     conditions: {DEEP: true}
+    sound: WIND_WHISTLES
 - LOC_WATERFALL:
     description:
       long: 'You are in a magnificent cavern with a rushing stream, which cascades\nover a sparkling waterfall into a roaring whirlpool which disappears\nthrough a hole in the floor.  Passages exit to the south and west.'
       short: 'You''re in cavern with waterfall.'
     conditions: {FLUID: true, DEEP: true}
+    sound: STREAM_SPLASHES
 - LOC_SOFTROOM:
     description:
       long: 'You are in the Soft Room.  The walls are covered with heavy curtains,\nthe floor with a thick pile carpet.  Moss covers the ceiling.'
@@ -560,21 +682,25 @@ locations: !!omap
       long: 'You are following a wide path around the outer edge of a large cavern.\nFar below, through a heavy white mist, strange splashing noises can be\nheard.  The mist rises up through a fissure in the ceiling.  The path\nexits to the south and west.'
       short: 'You''re in misty cavern.'
     conditions: {DEEP: true}
+    sound: NO_MEANING
 - LOC_ALCOVE:
     description:
       long: 'You are in an alcove.  A small nw path seems to widen after a short\ndistance.  An extremely tight tunnel leads east.  It looks like a very\ntight squeeze.  An eerie light can be seen at the other end.'
       short: 'You''re in alcove.'
-    conditions: {DEEP: true, HDARK: true}
+    conditions: {DEEP: true}
+    hints: [*dark]
 - LOC_PLOVER:
     description:
       long: 'You''re in a small chamber lit by an eerie green light.  An extremely\nnarrow tunnel exits to the west.  A dark corridor leads ne.'
       short: 'You''re in Plover Room.'
-    conditions: {DEEP: true, HDARK: true, LIT: true}
+    conditions: {DEEP: true, LIT: true}
+    hints: [*dark]
 - LOC_DARKROOM:
     description:
       long: 'You''re in the dark-room.  A corridor leading south is the only exit.'
       short: 'You''re in dark-room.'
-    conditions: {DEEP: true, HDARK: true}
+    conditions: {DEEP: true}
+    hints: [*dark]
 - LOC_ARCHED:
     description:
       long: 'You are in an arched hall.  A coral passage once continued up and east\nfrom here, but is now blocked by debris.  The air smells of sea water.'
@@ -609,12 +735,15 @@ locations: !!omap
     description:
       long: 'You are at Witt''s End.  Passages lead off in *ALL* directions.'
       short: 'You''re at Witt''s End.'
-    conditions: {DEEP: true, HWITT: true, NOBACK: true}
+    conditions: {DEEP: true, NOBACK: true}
+    hints: [*witt]
 - LOC_MIRRORCANYON:
     description:
       long: 'You are in a north/south canyon about 25 feet across.  The floor is\ncovered by white mist seeping in from the north.  The walls extend\nupward for well over 100 feet.  Suspended from some unseen point far\nabove you, an enormous two-sided mirror is hanging parallel to and\nmidway between the canyon walls.  (The mirror is obviously provided\nfor the use of the dwarves who, as you know, are extremely vain.)  A\nsmall window can be seen in either wall, some fifty feet up.'
       short: 'You''re in Mirror Canyon.'
-    conditions: {DEEP: true, HJADE: true}
+    conditions: {DEEP: true}
+    hints: [*jade]
+    sound: WIND_WHISTLES
 - LOC_WINDOW2:
     description:
       long: 'You''re at a low window overlooking a huge pit, which extends up out of\nsight.  A floor is indistinctly visible over 50 feet below.  Traces of\nwhite mist cover the floor of the pit, becoming thicker to the left.\nMarks in the dust around the window would seem to indicate that\nsomeone has been here recently.  Directly across the pit from you and\n25 feet away there is a similar window looking into a lighted room.  A\nshadowy figure can be seen there peering back at you.'
@@ -635,6 +764,7 @@ locations: !!omap
       long: 'You are at the edge of a large underground reservoir.  An opaque cloud\nof white mist fills the room and rises rapidly upward.  The lake is\nfed by a stream, which tumbles out of a hole in the wall about 10 feet\noverhead and splashes noisily into the water somewhere within the\nmist.  There is a passage going back toward the south.'
       short: 'You''re at reservoir.'
     conditions: {FLUID: true, DEEP: true}
+    sound: STREAM_SPLASHES
 - LOC_DEADEND12:
     description:
       long: 'Dead end'
@@ -645,11 +775,13 @@ locations: !!omap
       long: 'You are at the northeast end of an immense room, even larger than the\nGiant Room.  It appears to be a repository for the "Adventure"\nprogram.  Massive torches far overhead bathe the room with smoky\nyellow light.  Scattered about you can be seen a pile of bottles (all\nof them empty), a nursery of young beanstalks murmuring quietly, a bed\nof oysters, a bundle of black rods with rusty stars on their ends, and\na collection of brass lanterns.  Off to one side a great many dwarves\nare sleeping on the floor, snoring loudly.  A notice nearby reads: "Do\nnot disturb the dwarves!"  An immense mirror is hanging against one\nwall, and stretches to the other end of the room, where various other\nsundry objects can be glimpsed dimly in the distance.'
       short: 'You''re at ne end.'
     conditions: {DEEP: true, LIT: true}
+    sound: MURMURING_SNORING
 - LOC_SW:
     description:
       long: 'You are at the southwest end of the repository.  To one side is a pit\nfull of fierce green snakes.  On the other side is a row of small\nwicker cages, each of which contains a little sulking bird.  In one\ncorner is a bundle of black rods with rusty marks on their ends.  A\nlarge number of velvet pillows are scattered about on the floor.  A\nvast mirror stretches off to the northeast.  At your feet is a large\nsteel grate, next to which is a sign that reads, "Treasure Vault.\nKeys in main office."'
       short: 'You''re at sw end.'
     conditions: {DEEP: true, LIT: true}
+    sound: SNAKES_HISSING
 - LOC_SWCHASM:
     description:
       long: 'You are on one side of a large, deep chasm.  A heavy white mist rising\nup from below obscures all view of the far side.  A sw path leads away\nfrom the chasm into a winding corridor.'
@@ -685,26 +817,33 @@ locations: !!omap
       long: 'You''re in a long east/west corridor.  A faint rumbling noise can be\nheard in the distance.'
       short: 'You''re in corridor.'
     conditions: {NOARRR: true, DEEP: true}
+    sound: DULL_RUMBLING
 - LOC_FORK:
     description:
       long: 'The path forks here.  The left fork leads northeast.  A dull rumbling\nseems to get louder in that direction.  The right fork leads southeast\ndown a gentle slope.  The main corridor enters from the west.'
       short: 'You''re at fork in path.'
     conditions: {NOARRR: true, DEEP: true}
+    sound: DULL_RUMBLING
 - LOC_WARMWALLS:
     description:
       long: 'The walls are quite warm here.  From the north can be heard a steady\nroar, so loud that the entire cave seems to be trembling.  Another\npassage leads south, and a low crawl goes east.'
       short: 'You''re at junction with warm walls.'
     conditions: {NOARRR: true, DEEP: true}
+    sound: LOUD_ROAR
 - LOC_BREATHTAKING:
     description:
       long: 'You are on the edge of a breath-taking view.  Far below you is an\nactive volcano, from which great gouts of molten lava come surging\nout, cascading back down into the depths.  The glowing rock fills the\nfarthest reaches of the cavern with a blood-red glare, giving every-\nthing an eerie, macabre appearance.  The air is filled with flickering\nsparks of ash and a heavy smell of brimstone.  The walls are hot to\nthe touch, and the thundering of the volcano drowns out all other\nsounds.  Embedded in the jagged roof far overhead are myriad twisted\nformations composed of pure white alabaster, which scatter the murky\nlight into sinister apparitions upon the walls.  To one side is a deep\ngorge, filled with a bizarre chaos of tortured rock which seems to\nhave been crafted by the devil himself.  An immense river of fire\ncrashes out from the depths of the volcano, burns its way through the\ngorge, and plummets into a bottomless pit far off to your left.  To\nthe right, an immense geyser of blistering steam erupts continuously\nfrom a barren island in the center of a sulfurous lake, which bubbles\nominously.  The far right wall is aflame with an incandescence of its\nown, which lends an additional infernal splendor to the already\nhellish scene.  A dark, foreboding passage exits to the south.'
       short: 'You''re at breath-taking view.'
-    conditions: {NOARRR: true, HJADE: true, LIT: true, DEEP: true}
+    conditions: {NOARRR: true, LIT: true, DEEP: true}
+    hints: [*jade]
+    sound: TOTAL_ROAR
+    loud: true
 - LOC_BOULDERS2:
     description:
       long: 'You are in a small chamber filled with large boulders.  The walls are\nvery warm, causing the air in the room to be almost stifling from the\nheat.  The only exit is a crawl heading west, through which is coming\na low rumbling.'
       short: 'You''re in Chamber of Boulders.'
     conditions: {NOARRR: true, DEEP: true}
+    sound: DULL_RUMBLING
 - LOC_LIMESTONE:
     description:
       long: 'You are walking along a gently sloping north/south passage lined with\noddly shaped limestone formations.'
@@ -784,7 +923,8 @@ locations: !!omap
     description:
       long: 'You are in a large chamber with passages to the west and north.'
       short: !!null
-    conditions: {HOGRE: true, DEEP: true}
+    conditions: {DEEP: true}
+    hints: [*ogre]
 - LOC_STOREROOM:
     description:
       long: 'You are in the ogre''s storeroom.  The only exit is to the south.'
@@ -794,127 +934,152 @@ locations: !!omap
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST2:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST3:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST4:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST5:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST6:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST7:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST8:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST9:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST10:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST11:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST12:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST13:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST14:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST15:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST16:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST17:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST18:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST19:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST20:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST21:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_FOREST22:
     description:
       long: 'You are wandering aimlessly through the forest.'
       short: !!null
-    conditions: {HWOODS: true, FOREST: true, NOBACK: true, LIT: true, DEEP: true}
+    conditions: {FOREST: true, NOBACK: true, LIT: true}
+    hints: [*forest]
 - LOC_LEDGE:
     description:
       long: 'You are on a small ledge on one face of a sheer cliff.  There are no\npaths away from the ledge.  Across the chasm is a small clearing\nsurrounded by forest.'
       short: 'You''re on ledge.'
-    conditions: {DEEP: true, LIT: true}
+    conditions: {ABOVE: true, LIT: true}
 - LOC_RESBOTTOM:
     description:
       long: 'You are walking across the bottom of the reservoir.  Walls of water\nrear up on either side.  The roar of the water cascading past is\nnearly deafening, and the mist is so thick you can barely see.'
       short: 'You''re at bottom of reservoir.'
     conditions: {FLUID: true, DEEP: true}
+    sound: TOTAL_ROAR
+    loud: true
 - LOC_RESNORTH:
     description:
       long: 'You are at the northern edge of the reservoir.  A northwest passage\nleads sharply up from here.'
       short: 'You''re north of reservoir.'
     conditions: {FLUID: true, DEEP: true}
+    sound: WATERS_CRASHING
 - LOC_TREACHEROUS:
     description:
       long: 'You are scrambling along a treacherously steep, rocky passage.'
@@ -964,12 +1129,12 @@ locations: !!omap
     description:
       long: '>>Foof!<<'
       short: !!null
-    conditions: {DEEP: true}
+    conditions: {}
 - LOC_FOOF2:
     description:
       long: '>>Foof!<<'
       short: !!null
-    conditions: {DEEP: true}
+    conditions: {ABOVE: true}
 - LOC_FOOF3:
     description:
       long: '>>Foof!<<'
@@ -979,7 +1144,7 @@ locations: !!omap
     description:
       long: '>>Foof!<<'
       short: !!null
-    conditions: {DEEP: true}
+    conditions: {ABOVE: true}
 - LOC_FOOF5:
     description:
       long: '>>Foof!<<'
@@ -990,10 +1155,6 @@ locations: !!omap
       long: '>>Foof!<<'
       short: !!null
     conditions: {DEEP: true}
-- LOC_NUGGET5:
-    description:
-      long: !!null
-      short: !!null
 
 arbitrary_messages:  !!omap
 - NO_MESSAGE: !!null
@@ -1185,7 +1346,7 @@ arbitrary_messages:  !!omap
 - PIRATE_SPOTTED: 'There are faint rustling noises from the darkness behind you.  As you\nturn toward them, the beam of your lamp falls across a bearded pirate.\nHe is carrying a large chest.  "Shiver me timbers!" he cries, "I''ve\nbeen spotted!  I''d best hie meself off to the maze to hide me chest!"\nWith that, he vanishes into the gloom.'
 - GET_BATTERIES: 'Your lamp is getting dim.  You''d best go back for those batteries.'
 - REPLACE_BATTERIES: 'Your lamp is getting dim.  I''m taking the liberty of replacing the\nbatteries.'
-- MISSING_BATTERYIES: 'Your lamp is getting dim, and you''re out of spare batteries.  You''d\nbest start wrapping this up.'
+- MISSING_BATTERIES: 'Your lamp is getting dim, and you''re out of spare batteries.  You''d\nbest start wrapping this up.'
 - REMOVE_MESSAGE: 'You sift your fingers through the dust, but succeed only in\nobliterating the cryptic message.'
 - OGRE_QUERY: 'Do you need help dealing with the ogre?'
 - CLUE_QUERY: 'Hmmm, this looks like a clue, which means it''ll cost you 10 points to\nread it.  Should I go ahead and read it anyway?'
@@ -1197,6 +1358,7 @@ arbitrary_messages:  !!omap
 - BREAK_VASE: 'You have taken the vase and hurled it delicately to the ground.'
 - PROD_DWARF: 'You prod the nearest dwarf, who wakes up grumpily, takes one look at\nyou, curses, and grabs for his axe.'
 - THIS_ACCEPTABLE: 'Is this acceptable?'
+# This message is not currently used
 - ALREADY_OVER: 'This adventure is already over.  To start a new adventure, or to\nresume an earlier adventure, please run a fresh copy of the program.'
 - OGRE_FULL: 'The ogre doesn''t appear to be hungry.'
 - OGRE_DODGE: 'The ogre, who despite his bulk is quite agile, easily dodges your\nattack.  He seems almost amused by your puny effort.'
@@ -1266,7 +1428,8 @@ arbitrary_messages:  !!omap
 - TABLE_SPACE: 'Table space used:\n%d of %d words of messages   %d of %d travel options\n%d of %d vocabulary words    %d of %d locations\n%d of %d objects             %d of %d action verbs\n%d of %d "random" messages   %d of %d "class" messages\n%d of %d hints               %d of %d turn threshholds'
 - RESUME_ABANDON: 'To resume an earlier Adventure, you must abandon the current one.'
 - VERSION_SKEW: 'I''m sorry, but that Adventure was begun using Version%d.%d of the\nprogram, and this is Version%d.%d.  You must find the other version\nin order to resume that Adventure.'
-- DAVE_TAMPERING: 'A dark fog creeps in to surround you.  From somewhere in the fog you\nhear a stern voice.  "This Adventure has been tampered with!  You have\nbeen dabbling in magic, knowing not the havoc you might cause thereby.\nLeave at once, before you do irrevocable harm!"  The fog thickens,\nuntil at last you can see nothing at all.  Your vision then clears,\nand you find yourself back in The Real World.'
+# This message is not currently used
+- SAVE_TAMPERING: 'A dark fog creeps in to surround you.  From somewhere in the fog you\nhear a stern voice.  "This Adventure has been tampered with!  You have\nbeen dabbling in magic, knowing not the havoc you might cause thereby.\nLeave at once, before you do irrevocable harm!"  The fog thickens,\nuntil at last you can see nothing at all.  Your vision then clears,\nand you find yourself back in The Real World.'
 - GUESS_AGAIN: 'Guess again.'
 - MISSING_ONE: 'You''re missing only one other treasure.  Do you need help finding it?'
 - NO_LOCATE: 'Once you''ve found all the other treasures, it is no longer possible to\nlocate the one you''re now missing.'
@@ -1274,6 +1437,8 @@ arbitrary_messages:  !!omap
 - ADVENTURE_NEWS: 'Open Adventure is an author-approved open-source release of\nVersion 2.5 with, as yet, no gameplay changes.\nVersion 2.5 was essentially the same as Version II; the cave and the\nhazards therein are unchanged, and top score is still 430 points.\nThere are a few more hints, especially for some of the more obscure\npuzzles.  There are a few minor bugfixes and cosmetic changes.  You\ncan now save a game and resume it at once (formerly you had to wait a\nwhile first), but it now costs you a few points each time you save the\ngame.  Saved games are now stored in much smaller files than before.'
 - GO_UNNEEDED: 'You don''t have to say "go" every time; just specify a direction or, if\nit''s nearby, name the place to which you wish to move.'
 - CANNOT_CARRY7: !!null
+- MACHINE_SWINGOUT: 'As you strike the vending machine, it pivots backward along with a\nsection of wall, revealing a dark passage leading south.'
+- MACHINE_SWINGBACK: 'The vending machine swings back to block the passage.'
   
 classes: 
 - threshold: 0
@@ -1324,13 +1489,13 @@ object_descriptions: !!omap
 - OBJ_2:
     inventory: 'Brass lantern'
     longs:
-    - 'There is a shiny brass lamp nearby.'
-    - 'There is a lamp shining nearby.'
+    - [LAMP_DARK, 'There is a shiny brass lamp nearby.']
+    - [LAMP_BRIGHT, 'There is a lamp shining nearby.']
 - OBJ_3:
     inventory: '*grate'
     longs:
-    - 'The grate is locked.'
-    - 'The grate is open.'
+    - [GRATE_CLOSED, 'The grate is locked.']
+    - [GRATE_OPEN, 'The grate is open.']
 - OBJ_4:
     inventory: 'Wicker cage'
     longs:
@@ -1351,9 +1516,10 @@ object_descriptions: !!omap
 - OBJ_8:
     inventory: 'Little bird in cage'
     longs:
-    - 'A cheerful little bird is sitting here singing.'
-    - 'There is a little bird in the cage.'
-    - 'A cheerful little bird is sitting here singing.'
+    - [BIRD_UNCAGED, 'A cheerful little bird is sitting here singing.']
+    - [BIRD_CAGED, 'There is a little bird in the cage.']
+    - [BIRD_FOREST_UNCAGED, 'A cheerful little bird is sitting here singing.']
+    sounds:
     - 'The bird''s singing is quite melodious.'
     - 'The bird does not seem inclined to sing while in the cage.'
     - 'It almost seems as though the bird is trying to tell you something.'
@@ -1374,6 +1540,7 @@ object_descriptions: !!omap
     longs:
     - 'A huge green fierce snake bars the way!'
     - '' # chased away
+    sounds:
     - 'The snake is hissing venomously.'
 - OBJ_12:
     inventory: '*fissure'
@@ -1385,23 +1552,27 @@ object_descriptions: !!omap
     inventory: '*stone tablet'
     longs:
     - 'A massive stone tablet imbedded in the wall reads:\n"Congratulations on bringing light into the dark-room!"'
+    texts:
     - '"Congratulations on bringing light into the dark-room!"'
 - OBJ_14:
     inventory: 'Giant clam  >GRUNT!<'
     longs:
     - 'There is an enormous clam here with its shell tightly closed.'
+    sounds:
     - 'The clam is as tight-mouthed as a, er, clam.'
 - OBJ_15:
     inventory: 'Giant oyster  >GROAN!<'
     longs:
     - 'There is an enormous oyster here with its shell tightly closed.'
     - 'Interesting.  There seems to be something written on the underside of\nthe oyster.'
+    sounds:
     - 'Even though it''s an oyster, the critter''s as tight-mouthed as a clam.'
     - 'It says the same thing it did before.  Hm, maybe it''s a pun?'
 - OBJ_16:
     inventory: '"Spelunker Today"'
     longs:
     - 'There are a few recent issues of "Spelunker Today" magazine here.'
+    texts:
     - 'I''m afraid the magazine is written in dwarvish.  But pencilled on one\ncover you see, "Please leave the magazines at the construction site."'
 - OBJ_17:
     inventory: !!null
@@ -1416,9 +1587,9 @@ object_descriptions: !!omap
 - OBJ_20:
     inventory: 'Small bottle'
     longs:
-    - 'There is a bottle of water here.'
-    - 'There is an empty bottle here.'
-    - 'There is a bottle of oil here.'
+    - [WATER_BOTTLE, 'There is a bottle of water here.']
+    - [EMPTY_BOTTLE, 'There is an empty bottle here.']
+    - [OIL_BOTTLE, 'There is a bottle of oil here.']
 - OBJ_21:
     inventory: 'Water in the bottle'
     longs: !!null
@@ -1437,6 +1608,7 @@ object_descriptions: !!omap
     - 'The plant spurts into furious growth for a few seconds.'
     - 'The plant grows explosively, almost filling the bottom of the pit.'
     - 'You''ve over-watered the plant!  It''s shriveling up!  And now . . .'
+    sounds:
     - 'The plant continues to ask plaintively for water.'
     - 'The plant continues to demand water.'
     - 'The plant now maintains a contented silence.'
@@ -1472,6 +1644,7 @@ object_descriptions: !!omap
     - 'The blood-specked body of a huge green dead dragon lies to one side.'
     - 'The body of a huge green dead dragon is lying off to one side.'
     - 'Congratulations!  You have just vanquished a dragon with your bare\nhands!  (Unbelievable, isn''t it?)'
+    sounds:
     - 'The dragon''s ominous hissing does not bode well for you.'
     - 'The dragon is, not surprisingly, silent.'
     - 'The dragon is, not surprisingly, silent.'
@@ -1486,6 +1659,7 @@ object_descriptions: !!omap
     - 'A burly troll stands by the bridge and insists you throw him a\ntreasure before you may cross.'
     - 'The troll steps out from beneath the bridge and blocks your way.'
     - '' # chased away
+    sounds:
     - 'The troll sounds quite adamant in his demand for a treasure.'
 - OBJ_34:
     inventory: '*phony troll'
@@ -1502,6 +1676,7 @@ object_descriptions: !!omap
     inventory: '*message in second maze'
     longs:
     - 'There is a message scrawled in the dust in a flowery script, reading:\n"This is not the maze where the pirate leaves his treasure chest."'
+    texts:
     - '"This is not the maze where the pirate leaves his treasure chest."'
 - OBJ_37:
     inventory: '*volcano and/or geyser'
@@ -1509,17 +1684,16 @@ object_descriptions: !!omap
 - OBJ_38:
     inventory: '*vending machine'
     longs:
-    - 'There is a massive and somewhat battered vending machine here.  The\ninstructions on it read: "Drop coins here to receive fresh batteries."'
+    - [VEND_BLOCKS, 'There is a massive and somewhat battered vending machine here.  The\ninstructions on it read: "Drop coins here to receive fresh batteries."']
+    - [VEND_UNBLOCKS, 'There is a massive vending machine here, swung back to reveal a\nsouthward passage.']
+    texts:
     - '"Drop coins here to receive fresh batteries."'
-    - 'As you strike the vending machine, it pivots backward along with a\nsection of wall, revealing a dark passage leading south.'
-    - 'There is a massive vending machine here, swung back to reveal a\nsouthward passage.'
     - '"Drop coins here to receive fresh batteries."'
-    - 'The vending machine swings back to block the passage.'
 - OBJ_39:
     inventory: 'Batteries'
     longs:
-    - 'There are fresh batteries here.'
-    - 'Some worn-out batteries have been discarded nearby.'
+    - [FRESH_BATTERIES, 'There are fresh batteries here.']
+    - [DEAD_BATTERIES, 'Some worn-out batteries have been discarded nearby.']
 - OBJ_40:
     inventory: '*carpet and/or moss and/or curtains'
     longs: !!null
@@ -1527,6 +1701,7 @@ object_descriptions: !!omap
     inventory: '*ogre'
     longs:
     - 'A formidable ogre bars the northern exit.'
+    sounds:
     - 'The ogre is apparently the strong, silent type.'
 - OBJ_42:
     inventory: '*urn'
@@ -1557,204 +1732,135 @@ object_descriptions: !!omap
     inventory: '*mud'
     longs:
     - ''
+    texts:
     - '"MAGIC WORD XYZZY"'
 - OBJ_48:
     inventory: '*note'
     longs:
     - ''
+    texts:
     - '"You won''t get it up the steps"'
 - OBJ_49:
     inventory: '*sign'
     longs:
-    - ''
+    - [INGAME_SIGN, '']
+    - [ENDGAME_SIGN, '']
+    texts:
     - 'Cave under construction beyond this point.\n           Proceed at own risk.\n       [Witt Construction Company]'
     - '"Treasure Vault.  Keys in main office."'
 - OBJ_50:
     inventory: 'Large gold nugget'
+    treasure: true
     longs:
     - 'There is a large sparkling nugget of gold here!'
 - OBJ_51:
     inventory: 'Several diamonds'
+    treasure: true
     longs:
     - 'There are diamonds here!'
 - OBJ_52:
     inventory: 'Bars of silver'
+    treasure: true
     longs:
     - 'There are bars of silver here!'
 - OBJ_53:
     inventory: 'Precious jewelry'
+    treasure: true
     longs:
     - 'There is precious jewelry here!'
 - OBJ_54:
     inventory: 'Rare coins'
+    treasure: true
     longs:
     - 'There are many coins here!'
 - OBJ_55:
     inventory: 'Treasure chest'
+    treasure: true
     longs:
     - 'The pirate''s treasure chest is here!'
 - OBJ_56:
     inventory: 'Golden eggs'
+    treasure: true
     longs:
     - 'There is a large nest here, full of golden eggs!'
     - 'The nest of golden eggs has vanished!'
     - 'Done!'
 - OBJ_57:
     inventory: 'Jeweled trident'
+    treasure: true
     longs:
     - 'There is a jewel-encrusted trident here!'
 - OBJ_58:
     inventory: 'Ming vase'
+    treasure: true
     longs:
-    - 'There is a delicate, precious, ming vase here!'
-    - 'The vase is now resting, delicately, on a velvet pillow.'
-    - 'The floor is littered with worthless shards of pottery.'
-    - 'The ming vase drops with a delicate crash.'
+    - [VASE_WHOLE, 'There is a delicate, precious, ming vase here!']
+    - [VASE_RESTING, 'The vase is now resting, delicately, on a velvet pillow.']
+    - [VASE_BROKEN, 'The floor is littered with worthless shards of pottery.']
+    - [VASE_DROPS, 'The ming vase drops with a delicate crash.']
 - OBJ_59:
     inventory: 'Egg-sized emerald'
+    treasure: true
     longs:
     - 'There is an emerald here the size of a plover''s egg!'
     - 'There is an emerald resting in a small cavity in the rock!'
 - OBJ_60:
     inventory: 'Platinum pyramid'
+    treasure: true
     longs:
     - 'There is a platinum pyramid here, 8 inches on a side!'
 - OBJ_61:
     inventory: 'Glistening pearl'
+    treasure: true
     longs:
     - 'Off to one side lies a glistening pearl!'
 - OBJ_62:
     inventory: 'Persian rug'
+    treasure: true
     longs:
     - 'There is a persian rug spread out on the floor!'
     - 'The dragon is sprawled out on a persian rug!!'
     - 'There is a persian rug here, hovering in mid-air!'
 - OBJ_63:
     inventory: 'Rare spices'
+    treasure: true
     longs:
     - 'There are rare spices here!'
 - OBJ_64:
     inventory: 'Golden chain'
+    treasure: true
     longs:
     - 'There is a golden chain lying in a heap on the floor!'
     - 'The bear is locked to the wall with a golden chain!'
     - 'There is a golden chain locked to the wall!'
 - OBJ_65:
     inventory: 'Giant ruby'
+    treasure: true
     longs:
     - 'There is an enormous ruby here!'
     - 'There is a ruby resting in a small cavity in the rock!'
 - OBJ_66:
     inventory: 'Jade necklace'
+    treasure: true
     longs:
     - 'A precious jade necklace has been dropped here!'
 - OBJ_67:
     inventory: 'Amber gemstone'
+    treasure: true
     longs:
     - 'There is a rare amber gemstone here!'
     - 'There is an amber gemstone resting in a small cavity in the rock!'
 - OBJ_68:
     inventory: 'Star sapphire'
+    treasure: true
     longs:
     - 'A brilliant blue star sapphire is here!'
     - 'There is a star sapphire resting in a small cavity in the rock!'
 - OBJ_69:
     inventory: 'Ebony statuette'
+    treasure: true
     longs:
     - 'There is a richly-carved ebony statuette here!'
-- OBJ_70:
-    inventory: !!null
-    longs: !!null
-- OBJ_71:
-    inventory: !!null
-    longs: !!null
-- OBJ_72:
-    inventory: !!null
-    longs: !!null
-- OBJ_73:
-    inventory: !!null
-    longs: !!null
-- OBJ_74:
-    inventory: !!null
-    longs: !!null
-- OBJ_75:
-    inventory: !!null
-    longs: !!null
-- OBJ_76:
-    inventory: !!null
-    longs: !!null
-- OBJ_77:
-    inventory: !!null
-    longs: !!null
-- OBJ_78:
-    inventory: !!null
-    longs: !!null
-- OBJ_79:
-    inventory: !!null
-    longs: !!null
-- OBJ_80:
-    inventory: !!null
-    longs: !!null
-- OBJ_81:
-    inventory: !!null
-    longs: !!null
-- OBJ_82:
-    inventory: !!null
-    longs: !!null
-- OBJ_83:
-    inventory: !!null
-    longs: !!null
-- OBJ_84:
-    inventory: !!null
-    longs: !!null
-- OBJ_85:
-    inventory: !!null
-    longs: !!null
-- OBJ_86:
-    inventory: !!null
-    longs: !!null
-- OBJ_87:
-    inventory: !!null
-    longs: !!null
-- OBJ_88:
-    inventory: !!null
-    longs: !!null
-- OBJ_89:
-    inventory: !!null
-    longs: !!null
-- OBJ_90:
-    inventory: !!null
-    longs: !!null
-- OBJ_91:
-    inventory: !!null
-    longs: !!null
-- OBJ_92:
-    inventory: !!null
-    longs: !!null
-- OBJ_93:
-    inventory: !!null
-    longs: !!null
-- OBJ_94:
-    inventory: !!null
-    longs: !!null
-- OBJ_95:
-    inventory: !!null
-    longs: !!null
-- OBJ_96:
-    inventory: !!null
-    longs: !!null
-- OBJ_97:
-    inventory: !!null
-    longs: !!null
-- OBJ_98:
-    inventory: !!null
-    longs: !!null
-- OBJ_99:
-    inventory: !!null
-    longs: !!null
-- OBJ_100:
-    inventory: !!null
-    longs: !!null
 
 obituaries:
   - query: 'Oh dear, you seem to have gotten yourself killed.  I might be able to\nhelp you out, but I''ve never really done this before.  Do you want me\nto try to reincarnate you?'
@@ -1764,57 +1870,4 @@ obituaries:
   - query: 'Now you''ve really done it!  I''m out of orange smoke!  You don''t expect\nme to do a decent reincarnation without any orange smoke, do you?'
     yes_response: 'Okay, if you''re so smart, do it yourself!  I''m leaving!'
 
-# FIXME: Hint texts shouldn't be in arbitrary_messages, but inlined here
-hints:
-- number: 1
-  turns: 4
-  penalty: 2
-  question: ENTRY_QUERY
-  hint: HARD_GRATE
-- number: 2
-  turns: 5
-  penalty: 2
-  question: BIRD_QUERY
-  hint: SKITTISH_BIRD
-- number: 3
-  turns: 8
-  penalty: 2
-  question: SNAKE_QUERY
-  hint: SNAKE_HINT
-- number: 4
-  turns: 75
-  penalty: 4
-  question: MAZE_HELP
-  hint: DROP_THINGS
-- number: 5
-  turns: 25
-  penalty: 5
-  question: PLOVER_QUERY
-  hint: EXPLORE_HINT
-- number: 6
-  turns: 20
-  penalty: 3
-  question: HELP_LEAVING
-  hint: NOGO_WEST
-- number: 7
-  turns: 8
-  penalty: 2
-  question: WONDERING_QUERY
-  hint: ADVANCED_SECTION
-- number: 8
-  turns: 25
-  penalty: 2
-  question: FOREST_QUERY
-  hint: GO_EAST
-- number: 9
-  turns: 10
-  penalty: 4
-  question: OGRE_QUERY
-  hint: OGRE_CLUE
-- number: 10
-  turns: 1
-  penalty: 4
-  question: MISSING_ONE
-  hint: NO_LOCATE
-
 # end