Implement and document %V escape so version only needs to be set once.
[open-adventure.git] / adventure.yaml
index df5dfc7f5399a0eea77afcd63e99f8ce6ed167ef..26c218573b9d8e14465cd1b929e2e496a726ec61 100644 (file)
@@ -6,14 +6,17 @@
 #
 # We define a bunch of YAML structures:
 #
-# vocabulary: Almost all the words the game knows - one of them (the
+# vocabulary: - This structure is unused, and will eventually be removed. -
+#    Almost all the words the game knows - one of them (the
 #    reservoir magic word) gets replaced with a randomly-generated
 #    cookie.  For each word there is a type (motion, action, object,
 #    or special) and a numeric value.  Multiple synonyms may have the
 #    same value.
 #
-# actspk: Default message for action verbs.  The numbers correspond to
-#    values in the vocabulary list.
+# motions: Motion words, grouped into synonyms.
+#
+# actions: Action words, grouped into synonyms, and their corresponding
+#    default messages.
 #
 # hints: Each item contains a hint number, a hint label (used to
 #    generate the value macro for the hint) the number of turns he
 #                      [pct, N]       Roll a die, n% chance of success
 #                      [carry, OBJ]   Must be carrying named object
 #                      [with, OBJ]    Must be carrying or in room with
-#                      [not, OBJ N]   Property of named OBJ must not be N
+#                      [not, OBJ N]   Property of named OBJ must not be N.
+#                                     N may be numeric or a state label.
 #    All attributes are optional except the long description and
 #    travel. 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.
+#    these messages need to be kept adjacent and ordered (for now),
+#    though there are no depenencies on actual numbers left.  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.
 #
 # classes: Each item contains a point threshold and a message
 #    describing a classification of player.  Point thresholds must be
 #    Order doesn't matter; the logic simply tests every threshold on
 #    the assumption that turn counts never decrease nor skip values.
 #
-# object_descriptions: Each item contains a description for use in the
-#    inventory command and one or more messages describing the object
-#    in different states.  There is also a boolean "treasure"
-#    attribute, defaulting to false.  An pbject may have one or two
-#    start locations (the gate is an example of a two-location object;
-#    it can be accessed from above or below).  An object may also be
-#    flagged immovable, meaning it cannot be carried.  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.
+# objects: Objects have attributes as follows...
+#      inventory:    A description for use in the inventory command.
+#      descriptions: Messages describing the object in different states.
+#                    If a state message is a tuple then the first element
+#                    is made the name of a #define visible to the code for
+#                    the associated state, numbered from zero upwards; it
+#                    is also a state label that can be used in travel-rule
+#                    'not' clauses.
+#       changes:     State-change messages to be emitted whenever the obect
+#                    *changes* to the (0-origin) state that is the index of the
+#                    message in this array.
+#       words:       The vocabulary word(s) referring to this object.
+#       treasure:    A boolean "treasure" used for point-scoring and pirate
+#                    snatches, defaulting to false.
+#       immovable:   An object may also be flagged
+#                    immovable, meaning it cannot be carried.
+#       locations:   An object may have one or two start locations (the gate
+#                    is an example of a two-location object; it can be accessed
+#                    from above or below).
 #
 # obituaries: Death messages and reincarnation queries.  Order is
 #    significant, they're used in succession as the player racks up
 #      %9 = A 9-digit number
 #      %B = Variable number of blanks
 #      %! = The entire message should be suppressed
-
-# There are duplicate keys in this vocabulary, that's why it can't be a normal
-# map.  You have to iterate through it looking for a match qualified by type.
-# 1 is not allocated because it's used as a sentinel value in motion-verb
-# lists.
-vocabulary: [
-    {word: "ROAD",  type: motion, value: 2},
-    {word: "HILL",  type: motion, value: 2},
-    {word: "ENTER", type: motion, value: 3},
-    {word: "UPSTR", type: motion, value: 4},
-    {word: "DOWNS", type: motion, value: 5},
-    {word: "FORES", type: motion, value: 6},
-    {word: "FORWA", type: motion, value: 7},
-    {word: "CONTI", type: motion, value: 7},
-    {word: "ONWAR", type: motion, value: 7},
-    {word: "BACK",  type: motion, value: 8},
-    {word: "RETUR", type: motion, value: 8},
-    {word: "RETRE", type: motion, value: 8},
-    {word: "VALLE", type: motion, value: 9},
-    {word: "STAIR", type: motion, value: 10},
-    {word: "OUT",   type: motion, value: 11},
-    {word: "OUTSI", type: motion, value: 11},
-    {word: "EXIT",  type: motion, value: 11},
-    {word: "LEAVE", type: motion, value: 11},
-    {word: "BUILD", type: motion, value: 12},
-    {word: "HOUSE", type: motion, value: 12},
-    {word: "GULLY", type: motion, value: 13},
-    {word: "STREA", type: motion, value: 14},
-    {word: "FORK",  type: motion, value: 15},
-    {word: "BED",   type: motion, value: 16},
-    {word: "CRAWL", type: motion, value: 17},
-    {word: "COBBL", type: motion, value: 18},
-    {word: "INWAR", type: motion, value: 19},
-    {word: "INSID", type: motion, value: 19},
-    {word: "IN",    type: motion, value: 19},
-    {word: "SURFA", type: motion, value: 20},
-    {word: "NULL",  type: motion, value: 21},
-    {word: "NOWHE", type: motion, value: 21},
-    {word: "DARK",  type: motion, value: 22},
-    {word: "PASSA", type: motion, value: 23},
-    {word: "TUNNE", type: motion, value: 23},
-    {word: "LOW",   type: motion, value: 24},
-    {word: "CANYO", type: motion, value: 25},
-    {word: "AWKWA", type: motion, value: 26},
-    {word: "GIANT", type: motion, value: 27},
-    {word: "VIEW",  type: motion, value: 28},
-    {word: "UPWAR", type: motion, value: 29},
-    {word: "UP",    type: motion, value: 29},
-    {word: "U",     type: motion, value: 29},
-    {word: "ABOVE", type: motion, value: 29},
-    {word: "ASCEN", type: motion, value: 29},
-    {word: "D",     type: motion, value: 30},
-    {word: "DOWNW", type: motion, value: 30},
-    {word: "DOWN",  type: motion, value: 30},
-    {word: "DESCE", type: motion, value: 30},
-    {word: "PIT",   type: motion, value: 31},
-    {word: "OUTDO", type: motion, value: 32},
-    {word: "CRACK", type: motion, value: 33},
-    {word: "STEPS", type: motion, value: 34},
-    {word: "DOME",  type: motion, value: 35},
-    {word: "LEFT",  type: motion, value: 36},
-    {word: "RIGHT", type: motion, value: 37},
-    {word: "HALL",  type: motion, value: 38},
-    {word: "JUMP",  type: motion, value: 39},
-    {word: "BARRE", type: motion, value: 40},
-    {word: "OVER",  type: motion, value: 41},
-    {word: "ACROS", type: motion, value: 42},
-    {word: "EAST",  type: motion, value: 43},
-    {word: "E",     type: motion, value: 43},
-    {word: "WEST",  type: motion, value: 44},
-    {word: "W",     type: motion, value: 44},
-    {word: "NORTH", type: motion, value: 45},
-    {word: "N",     type: motion, value: 45},
-    {word: "SOUTH", type: motion, value: 46},
-    {word: "S",     type: motion, value: 46},
-    {word: "NE",    type: motion, value: 47},
-    {word: "SE",    type: motion, value: 48},
-    {word: "SW",    type: motion, value: 49},
-    {word: "NW",    type: motion, value: 50},
-    {word: "DEBRI", type: motion, value: 51},
-    {word: "HOLE",  type: motion, value: 52},
-    {word: "WALL",  type: motion, value: 53},
-    {word: "BROKE", type: motion, value: 54},
-    {word: "Y2",    type: motion, value: 55},
-    {word: "CLIMB", type: motion, value: 56},
-    {word: "LOOK",  type: motion, value: 57},
-    {word: "EXAMI", type: motion, value: 57},
-    {word: "TOUCH", type: motion, value: 57},
-    {word: "DESCR", type: motion, value: 57},
-    {word: "FLOOR", type: motion, value: 58},
-    {word: "ROOM",  type: motion, value: 59},
-    {word: "SLIT",  type: motion, value: 60},
-    {word: "SLAB",  type: motion, value: 61},
-    {word: "SLABR", type: motion, value: 61},
-    {word: "XYZZY", type: motion, value: 62},
-    {word: "DEPRE", type: motion, value: 63},
-    {word: "ENTRA", type: motion, value: 64},
-    {word: "PLUGH", type: motion, value: 65},
-    {word: "SECRE", type: motion, value: 66},
-    {word: "CAVE",  type: motion, value: 67},
-    {word: "CROSS", type: motion, value: 69},
-    {word: "BEDQU", type: motion, value: 70},
-    {word: "PLOVE", type: motion, value: 71},
-    {word: "ORIEN", type: motion, value: 72},
-    {word: "CAVER", type: motion, value: 73},
-    {word: "SHELL", type: motion, value: 74},
-    {word: "RESER", type: motion, value: 75},
-    {word: "MAIN",  type: motion, value: 76},
-    {word: "OFFIC", type: motion, value: 76},
-    {word: "CARRY", type: action, value: 1},
-    {word: "TAKE",  type: action, value: 1},
-    {word: "KEEP",  type: action, value: 1},
-    {word: "CATCH", type: action, value: 1},
-    {word: "STEAL", type: action, value: 1},
-    {word: "CAPTU", type: action, value: 1},
-    {word: "GET",   type: action, value: 1},
-    {word: "TOTE",  type: action, value: 1},
-    {word: "SNARF", type: action, value: 1},
-    {word: "DROP",  type: action, value: 2},
-    {word: "RELEA", type: action, value: 2},
-    {word: "FREE",  type: action, value: 2},
-    {word: "DISCA", type: action, value: 2},
-    {word: "DUMP",  type: action, value: 2},
-    {word: "SAY",   type: action, value: 3},
-    {word: "CHANT", type: action, value: 3},
-    {word: "SING",  type: action, value: 3},
-    {word: "UTTER", type: action, value: 3},
-    {word: "MUMBL", type: action, value: 3},
-    {word: "UNLOC", type: action, value: 4},
-    {word: "OPEN",  type: action, value: 4},
-    {word: "NOTHI", type: action, value: 5},
-    {word: "LOCK",  type: action, value: 6},
-    {word: "CLOSE", type: action, value: 6},
-    {word: "LIGHT", type: action, value: 7},
-    {word: "ON",    type: action, value: 7},
-    {word: "EXTIN", type: action, value: 8},
-    {word: "OFF",   type: action, value: 8},
-    {word: "WAVE",  type: action, value: 9},
-    {word: "SHAKE", type: action, value: 9},
-    {word: "SWING", type: action, value: 9},
-    {word: "CALM",  type: action, value: 10},
-    {word: "PLACA", type: action, value: 10},
-    {word: "TAME",  type: action, value: 10},
-    {word: "WALK",  type: action, value: 11},
-    {word: "RUN",   type: action, value: 11},
-    {word: "TRAVE", type: action, value: 11},
-    {word: "GO",    type: action, value: 11},
-    {word: "PROCE", type: action, value: 11},
-    {word: "CONTI", type: action, value: 11},
-    {word: "EXPLO", type: action, value: 11},
-    {word: "FOLLO", type: action, value: 11},
-    {word: "TURN",  type: action, value: 11},
-    {word: "ATTAC", type: action, value: 12},
-    {word: "KILL",  type: action, value: 12},
-    {word: "FIGHT", type: action, value: 12},
-    {word: "HIT",   type: action, value: 12},
-    {word: "STRIK", type: action, value: 12},
-    {word: "SLAY",  type: action, value: 12},
-    {word: "POUR",  type: action, value: 13},
-    {word: "EAT",   type: action, value: 14},
-    {word: "DEVOU", type: action, value: 14},
-    {word: "DRINK", type: action, value: 15},
-    {word: "RUB",   type: action, value: 16},
-    {word: "THROW", type: action, value: 17},
-    {word: "TOSS",  type: action, value: 17},
-    {word: "QUIT",  type: action, value: 18},
-    {word: "FIND",  type: action, value: 19},
-    {word: "WHERE", type: action, value: 19},
-    {word: "INVEN", type: action, value: 20},
-    {word: "FEED",  type: action, value: 21},
-    {word: "FILL",  type: action, value: 22},
-    {word: "BLAST", type: action, value: 23},
-    {word: "DETON", type: action, value: 23},
-    {word: "IGNIT", type: action, value: 23},
-    {word: "BLOWU", type: action, value: 23},
-    {word: "SCORE", type: action, value: 24},
-    {word: "FEE",   type: action, value: 25},
-    {word: "FIE",   type: action, value: 25},
-    {word: "FOE",   type: action, value: 25},
-    {word: "FOO",   type: action, value: 25},
-    {word: "FUM",   type: action, value: 25},
-    {word: "BRIEF", type: action, value: 26},
-    {word: "READ",  type: action, value: 27},
-    {word: "PERUS", type: action, value: 27},
-    {word: "BREAK", type: action, value: 28},
-    {word: "SHATT", type: action, value: 28},
-    {word: "SMASH", type: action, value: 28},
-    {word: "WAKE",  type: action, value: 29},
-    {word: "DISTU", type: action, value: 29},
-    {word: "SUSPE", type: action, value: 30},
-    {word: "PAUSE", type: action, value: 30},
-    {word: "SAVE",  type: action, value: 30},
-    {word: "RESUM", type: action, value: 31},
-    {word: "RESTA", type: action, value: 31},
-    {word: "FLY",   type: action, value: 32},
-    {word: "LISTE", type: action, value: 33},
-    {word: "Z'ZZZ", type: action, value: 34}, # Gets replaced
-    {word: "FEE",   type: special, value: 1},
-    {word: "FIE",   type: special, value: 2},
-    {word: "FOE",   type: special, value: 3},
-    {word: "FOO",   type: special, value: 4},
-    {word: "FUM",   type: special, value: 5},
-    {word: "THANK", type: special, value: 13},
-    {word: "SESAM", type: special, value: 50},
-    {word: "OPENS", type: special, value: 50},
-    {word: "ABRA",  type: special, value: 50},
-    {word: "ABRAC", type: special, value: 50},
-    {word: "SHAZA", type: special, value: 50},
-    {word: "HOCUS", type: special, value: 50},
-    {word: "POCUS", type: special, value: 50},
-    {word: "HELP",  type: special, value: 51},
-    {word: "?",     type: special, value: 51},
-    {word: "NO",    type: special, value: 54},
-    {word: "TREE",  type: special, value: 64},
-    {word: "TREES", type: special, value: 64},
-    {word: "DIG",   type: special, value: 66},
-    {word: "EXCAV", type: special, value: 66},
-    {word: "LOST",  type: special, value: 68},
-    {word: "MIST",  type: special, value: 69},
-    {word: "FUCK",  type: special, value: 79},
-    {word: "STOP",  type: special, value: 139},
-    {word: "INFO",  type: special, value: 142},
-    {word: "INFOR", type: special, value: 142},
-    {word: "SWIM",  type: special, value: 147},
-    {word: "WIZAR", type: special, value: 246},
-    {word: "YES",   type: special, value: 271},
-    {word: "NEWS",  type: special, value: 275},
-]
-
-actspk: {
-    1: ALREADY_CARRYING,
-    2: ARENT_CARRYING,
-    3: NO_MESSAGE,
-    4: NOT_LOCKABLE,
-    5: NO_MESSAGE,
-    6: NOT_LOCKABLE,
-    7: DONT_UNDERSTAND,
-    8: DONT_UNDERSTAND,
-    9: NOTHING_HAPPENS,
-    10: AM_GAME,
-    11: WHERE_QUERY,
-    12: RIDICULOUS_ATTEMPT,
-    13: ARENT_CARRYING,
-    14: RIDICULOUS_ATTEMPT,
-    15: STREAM_WATER,
-    16: RUB_NOGO,
-    17: ARENT_CARRYING,
-    18: HUH_MAN,
-    19: NEARBY,
-    20: NEARBY,
-    21: NO_EDIBLES,
-    22: CANT_FILL,
-    23: REQUIRES_DYNAMITE,
-    24: HUH_MAN,
-    25: NOT_KNOWHOW,
-    26: ON_WHAT,
-    27: DONT_UNDERSTAND,
-    28: BEYOND_POWER,
-    29: RIDICULOUS_ATTEMPT,
-    30: HUH_MAN,
-    31: HUH_MAN,
-    32: AM_GAME,
-    33: DONT_UNDERSTAND,
-    34: NOTHING_HAPPENS,
-    35: HUH_MAN,
-}
+#      %V = substitute program version string
 
 motions: !!omap
 - MOT_0:
     words: !!null
-- MOT_1:
+- HERE:
     words: !!null
 - MOT_2:
     words: ['road', 'hill']
@@ -393,7 +141,7 @@ motions: !!omap
     words: ['downs']
 - MOT_6:
     words: ['fores']
-- MOT_7:
+- FORWARD:
     words: ['forwa', 'conti', 'onwar']
 - BACK:
     words: ['back', 'retur', 'retre']
@@ -401,7 +149,7 @@ motions: !!omap
     words: ['valle']
 - MOT_10:
     words: ['stair']
-- MOT_11:
+- OUTSIDE:
     words: ['out', 'outsi', 'exit', 'leave']
 - MOT_12:
     words: ['build', 'house']
@@ -413,11 +161,11 @@ motions: !!omap
     words: ['fork']
 - MOT_16:
     words: ['bed']
-- MOT_17:
+- CRAWL:
     words: ['crawl']
 - MOT_18:
     words: ['cobbl']
-- MOT_19:
+- INSIDE:
     words: ['inwar', 'insid', 'in']
 - MOT_20:
     words: ['surfa']
@@ -437,9 +185,9 @@ motions: !!omap
     words: ['giant']
 - MOT_28:
     words: ['view']
-- MOT_29:
+- UP:
     words: ['upwar', 'up', 'u', 'above', 'ascen']
-- MOT_30:
+- DOWN:
     words: ['d', 'downw', 'down', 'desce']
 - MOT_31:
     words: ['pit']
@@ -451,9 +199,9 @@ motions: !!omap
     words: ['steps']
 - MOT_35:
     words: ['dome']
-- MOT_36:
+- LEFT:
     words: ['left']
-- MOT_37:
+- RIGHT:
     words: ['right']
 - MOT_38:
     words: ['hall']
@@ -465,21 +213,21 @@ motions: !!omap
     words: ['over']
 - MOT_42:
     words: ['acros']
-- MOT_43:
+- EAST:
     words: ['east', 'e']
-- MOT_44:
+- WEST:
     words: ['west', 'w']
 - MOT_45:
     words: ['north', 'n']
 - MOT_46:
     words: ['south', 's']
-- MOT_47:
+- NE:
     words: ['ne']
-- MOT_48:
+- SE:
     words: ['se']
-- MOT_49:
+- SW:
     words: ['sw']
-- MOT_50:
+- NW:
     words: ['nw']
 - MOT_51:
     words: ['debri']
@@ -494,7 +242,7 @@ motions: !!omap
 - MOT_56:
     words: ['climb']
 - LOOK:
-    words: ['look', 'exami', 'touch', 'descr']
+    words: ['l', 'x', 'look', 'exami', 'touch', 'descr']
 - MOT_58:
     words: ['floor']
 - MOT_59:
@@ -503,13 +251,13 @@ motions: !!omap
     words: ['slit']
 - MOT_61:
     words: ['slab', 'slabr']
-- MOT_62:
+- XYZZY:
     words: ['xyzzy']
 - DPRSSN:
     words: ['depre']
 - ENTRNC:
     words: ['entra']
-- MOT_65:
+- PLUGH:
     words: ['plugh']
 - MOT_66:
     words: ['secre']
@@ -519,21 +267,199 @@ motions: !!omap
     words: !!null
 - MOT_69:
     words: ['cross']
-- MOT_70:
+- BEDQUILT:
     words: ['bedqu']
-- MOT_71:
+- PLOVER:
     words: ['plove']
-- MOT_72:
+- FORWARD2:
     words: ['orien']
-- MOT_73:
+- FORWARD3:
     words: ['caver']
-- MOT_74:
+- FORWARD4:
     words: ['shell']
-- MOT_75:
+- FORWARD5:
     words: ['reser']
-- MOT_76:
+- FORWARD6:
     words: ['main', 'offic']
 
+actions: !!omap
+- ACT_0:
+    message: !!null
+    words: !!null
+- CARRY:
+    message: ALREADY_CARRYING
+    words: ['g', 'carry', 'take', 'keep', 'catch', 'steal', 'captu', 'get', 'tote', 'snarf']
+- DROP:
+    message: ARENT_CARRYING
+    words: ['drop', 'relea', 'free', 'disca', 'dump']
+- SAY:
+    message: NO_MESSAGE
+    words: ['say', 'chant', 'sing', 'utter', 'mumbl']
+- UNLOCK:
+    message: NOT_LOCKABLE
+    words: ['unloc', 'open']
+- NOTHING:
+    message: NO_MESSAGE
+    words: ['z', 'nothi']
+- LOCK:
+    message: NOT_LOCKABLE
+    words: ['lock', 'close']
+- LIGHT:
+    message: DONT_UNDERSTAND
+    words: ['light', 'on']
+- EXTINGUISH:
+    message: DONT_UNDERSTAND
+    words: ['extin', 'off']
+- WAVE:
+    message: NOTHING_HAPPENS
+    words: ['wave', 'shake', 'swing']
+- TAME:
+    message: AM_GAME
+    words: ['calm', 'placa', 'tame']
+- GO:
+    message: WHERE_QUERY
+    words: ['walk', 'run', 'trave', 'go', 'proce', 'conti', 'explo', 'follo', 'turn']
+- ATTACK:
+    message: RIDICULOUS_ATTEMPT
+    words: ['attac', 'kill', 'fight', 'hit', 'strik', 'slay']
+- POUR:
+    message: ARENT_CARRYING
+    words: ['pour']
+- EAT:
+    message: RIDICULOUS_ATTEMPT
+    words: ['eat', 'devou']
+- DRINK:
+    message: STREAM_WATER
+    words: ['drink']
+- RUB:
+    message: RUB_NOGO
+    words: ['rub']
+- THROW:
+    message: ARENT_CARRYING
+    words: ['throw', 'toss']
+- QUIT:
+    message: HUH_MAN
+    words: ['quit']
+- FIND:
+    message: NEARBY
+    words: ['find', 'where']
+- INVENTORY:
+    message: NEARBY
+    words: ['i', 'inven']
+- FEED:
+    message: NO_EDIBLES
+    words: ['feed']
+- FILL:
+    message: CANT_FILL
+    words: ['fill']
+- BLAST:
+    message: REQUIRES_DYNAMITE
+    words: ['blast', 'deton', 'ignit', 'blowu']
+- SCORE:
+    message: HUH_MAN
+    words: ['score']
+- GIANTWORDS:
+    message: NOT_KNOWHOW
+    words: ['fee', 'fie', 'foe', 'foo', 'fum']
+- BRIEF:
+    message: ON_WHAT
+    words: ['brief']
+- READ:
+    message: DONT_UNDERSTAND
+    words: ['read', 'perus']
+- BREAK:
+    message: BEYOND_POWER
+    words: ['break', 'shatt', 'smash']
+- WAKE:
+    message: RIDICULOUS_ATTEMPT
+    words: ['wake', 'distu']
+- SAVE:
+    message: HUH_MAN
+    words: ['suspe', 'pause', 'save']
+- RESUME:
+    message: HUH_MAN
+    words: ['resum', 'resta']
+- FLY:
+    message: AM_GAME
+    words: ['fly']
+- LISTEN:
+    message: DONT_UNDERSTAND
+    words: ['liste']
+- PART:
+    message: NOTHING_HAPPENS
+    words: ['z''zzz']
+- ACT_35:
+    message: HUH_MAN
+    words: !!null
+
+specials: !!omap
+- SPC_0:
+    message: !!null
+    words: !!null
+- SPC_1:
+    message: !!null
+    words: ['fee']
+- SPC_2:
+    message: !!null
+    words: ['fie']
+- SPC_3:
+    message: !!null
+    words: ['foe']
+- SPC_4:
+    message: !!null
+    words: ['foo']
+- SPC_5:
+    message: !!null
+    words: ['fum']
+- SPC_13:
+    message: YOUR_WELCOME
+    words: ['thank']
+- SPC_50:
+    message: WORN_OUT
+    words: ['sesam', 'opens', 'abra', 'abrac', 'shaza', 'hocus', 'pocus']
+- SPC_51:
+    message: VOCAB_DESCRIPTION
+    words: ['help', '?']
+- SPC_54:
+    message: OK_MAN
+    words: ['no']
+- SPC_64:
+    message: FOREST_LOOK
+    words: ['tree', 'trees']
+- SPC_66:
+    message: DIGGING_FUTILE
+    words: ['dig', 'excav']
+- SPC_68:
+    message: IM_CONFUSED
+    words: ['lost']
+- SPC_69:
+    message: EXPLAIN_MIST
+    words: ['mist']
+- SPC_79:
+    message: WATCH_IT
+    words: ['fuck']
+- SPC_139:
+    message: STOP_UNKNOWN
+    words: ['stop']
+- SPC_142:
+    message: QUICK_START
+    words: ['info', 'infor']
+- SPC_147:
+    message: NOT_KNOWHOW
+    words: ['swim']
+- SPC_246:
+    message: WIZARDS_NODISTURB
+    words: ['wizar']
+- SPC_271:
+    message: GUESS_AGAIN
+    words: ['yes']
+- SPC_275:
+    message: ADVENTURE_NEWS
+    words: ['news']
+- SPC_276:
+    message: ADVENTURE_VERSION
+    words: ['versi']
+
 hints:
   - hint: &grate
       name: CAVE
@@ -714,7 +640,7 @@ locations: !!omap
       {verbs: ['WEST'], action: [goto, LOC_FOREST9]},
       {verbs: ['BUILD'], action: [goto, LOC_START]},
       {verbs: ['UPSTR', 'GULLY', 'NORTH'], action: [goto, LOC_SLIT]},
-      {verbs: ['ENTER', 'INWAR', 'D'], cond: [not, GRATE, 0,], action: [goto, LOC_BELOWGRATE]},
+      {verbs: ['ENTER', 'INWAR', 'D'], cond: [not, GRATE, GRATE_CLOSED], action: [goto, LOC_BELOWGRATE]},
       {verbs: ['ENTER'], action: ["speak", GRATE_NOWAY]},
     ]
 - LOC_BELOWGRATE:
@@ -723,7 +649,7 @@ locations: !!omap
       short: 'You''re below the grate.'
     conditions: {LIT: true}
     travel: [
-      {verbs: ['OUT', 'UPWAR'], cond: [not, GRATE, 0], action: [goto, LOC_GRATE]},
+      {verbs: ['OUT', 'UPWAR'], cond: [not, GRATE, GRATE_CLOSED], action: [goto, LOC_GRATE]},
       {verbs: ['OUT'], action: ["speak", GRATE_NOWAY]},
       {verbs: ['CRAWL', 'COBBL', 'INWAR', 'WEST'], action: [goto, LOC_COBBLE]},
       {verbs: ['PIT'], action: [goto, LOC_PITTOP]},
@@ -745,7 +671,7 @@ locations: !!omap
       short: 'You''re in debris room.'
     conditions: {}
     travel: [
-      {verbs: ['DEPRE'], cond: [not, GRATE, 0], action: [goto, LOC_GRATE]},
+      {verbs: ['DEPRE'], cond: [not, GRATE, GRATE_CLOSED], action: [goto, LOC_GRATE]},
       {verbs: ['ENTRA'], action: [goto, LOC_BELOWGRATE]},
       {verbs: ['CRAWL', 'COBBL', 'PASSA', 'LOW', 'EAST'], action: [goto, LOC_COBBLE]},
       {verbs: ['CANYO', 'INWAR', 'UPWAR', 'WEST'], action: [goto, LOC_AWKWARD]},
@@ -758,7 +684,7 @@ locations: !!omap
       short: !!null
     conditions: {}
     travel: [
-      {verbs: ['DEPRE'], cond: [not, GRATE, 0], action: [goto, LOC_GRATE]},
+      {verbs: ['DEPRE'], cond: [not, GRATE, GRATE_CLOSED], action: [goto, LOC_GRATE]},
       {verbs: ['ENTRA'], action: [goto, LOC_BELOWGRATE]},
       {verbs: ['D', 'EAST', 'DEBRI'], action: [goto, LOC_DEBRIS]},
       {verbs: ['INWAR', 'UPWAR', 'WEST'], action: [goto, LOC_BIRD]},
@@ -771,7 +697,7 @@ locations: !!omap
     conditions: {}
     hints: [*bird] 
     travel: [
-      {verbs: ['DEPRE'], cond: [not, GRATE, 0], action: [goto, LOC_GRATE]},
+      {verbs: ['DEPRE'], cond: [not, GRATE, GRATE_CLOSED], action: [goto, LOC_GRATE]},
       {verbs: ['ENTRA'], action: [goto, LOC_BELOWGRATE]},
       {verbs: ['DEBRI'], action: [goto, LOC_DEBRIS]},
       {verbs: ['CANYO', 'EAST'], action: [goto, LOC_AWKWARD]},
@@ -783,7 +709,7 @@ locations: !!omap
       short: 'You''re at top of small pit.'
     conditions: {}
     travel: [
-      {verbs: ['DEPRE'], cond: [not, GRATE, 0], action: [goto, LOC_GRATE]},
+      {verbs: ['DEPRE'], cond: [not, GRATE, GRATE_CLOSED], action: [goto, LOC_GRATE]},
       {verbs: ['ENTRA'], action: [goto, LOC_BELOWGRATE]},
       {verbs: ['DEBRI'], action: [goto, LOC_DEBRIS]},
       {verbs: ['PASSA', 'EAST'], action: [goto, LOC_BIRD]},
@@ -821,9 +747,9 @@ locations: !!omap
     conditions: {DEEP: true}
     travel: [
       {verbs: ['HALL', 'EAST'], action: [goto, LOC_MISTHALL]},
-      {verbs: ['JUMP'], cond: [not, FISSURE, 0], action: ["speak", CROSS_BRIDGE]},
-      {verbs: ['FORWA'], cond: [not, FISSURE, 1], action: [goto, LOC_NOMAKE]},
-      {verbs: ['OVER', 'ACROS', 'WEST', 'CROSS'], cond: [not, FISSURE, 1], action: ["speak", NO_CROSS]},
+      {verbs: ['JUMP'], cond: [not, FISSURE, UNBRIDGED], action: ["speak", CROSS_BRIDGE]},
+      {verbs: ['FORWA'], cond: [not, FISSURE, BRIDGED], action: [goto, LOC_NOMAKE]},
+      {verbs: ['OVER', 'ACROS', 'WEST', 'CROSS'], cond: [not, FISSURE, BRIDGED], action: ["speak", NO_CROSS]},
       {verbs: ['OVER'], action: [goto, LOC_WESTBANK]},
     ]
 - LOC_NUGGET:
@@ -842,9 +768,9 @@ locations: !!omap
     hints: [*snake]
     travel: [
       {verbs: ['STAIR', 'UPWAR', 'EAST'], action: [goto, LOC_MISTHALL]},
-      {verbs: ['NORTH', 'RIGHT'], cond: [not, SNAKE, 0], action: [goto, LOC_FLOORHOLE]},
-      {verbs: ['SOUTH', 'LEFT'], cond: [not, SNAKE, 0], action: [goto, LOC_SOUTHSIDE]},
-      {verbs: ['WEST', 'FORWA'], cond: [not, SNAKE, 0], action: [goto, LOC_WESTSIDE]},
+      {verbs: ['NORTH', 'RIGHT'], cond: [not, SNAKE, SNAKE_BLOCKS], action: [goto, LOC_FLOORHOLE]},
+      {verbs: ['SOUTH', 'LEFT'], cond: [not, SNAKE, SNAKE_BLOCKS], action: [goto, LOC_SOUTHSIDE]},
+      {verbs: ['WEST', 'FORWA'], cond: [not, SNAKE, SNAKE_BLOCKS], action: [goto, LOC_WESTSIDE]},
       {verbs: ['NORTH'], action: [goto, LOC_SNAKEBLOCK]},
       {verbs: ['SW'], cond: [pct, 35], action: [goto, LOC_SECRET3]},
       {verbs: ['SW'], cond: ["with", SNAKE], action: [goto, LOC_SNAKEBLOCK]},
@@ -917,9 +843,9 @@ locations: !!omap
       short: 'You''re on west bank of fissure.'
     conditions: {DEEP: true}
     travel: [
-      {verbs: ['JUMP'], cond: [not, FISSURE, 0], action: ["speak", CROSS_BRIDGE]},
-      {verbs: ['FORWA'], cond: [not, FISSURE, 1], action: [goto, LOC_NOMAKE]},
-      {verbs: ['OVER', 'ACROS', 'EAST', 'CROSS'], cond: [not, FISSURE, 1], action: ["speak", NO_CROSS]},
+      {verbs: ['JUMP'], cond: [not, FISSURE, UNBRIDGED], action: ["speak", CROSS_BRIDGE]},
+      {verbs: ['FORWA'], cond: [not, FISSURE, BRIDGED], action: [goto, LOC_NOMAKE]},
+      {verbs: ['OVER', 'ACROS', 'EAST', 'CROSS'], cond: [not, FISSURE, BRIDGED], action: ["speak", NO_CROSS]},
       {verbs: ['OVER'], action: [goto, LOC_EASTBANK]},
       {verbs: ['NORTH'], action: [goto, LOC_PARALLEL1]},
       {verbs: ['WEST'], action: [goto, LOC_MISTWEST]},
@@ -1363,7 +1289,7 @@ locations: !!omap
     conditions: {DEEP: true}
     travel: [
       {verbs: ['D', 'SLAB'], action: [goto, LOC_SLAB]},
-      {verbs: ['SOUTH'], cond: [not, DRAGON, 0], action: [goto, LOC_SECRET5]},
+      {verbs: ['SOUTH'], cond: [not, DRAGON, DRAGON_BLOCKS], action: [goto, LOC_SECRET5]},
       {verbs: ['SOUTH'], action: [goto, LOC_SECRET4]},
       {verbs: ['NORTH'], action: [goto, LOC_MIRRORCANYON]},
       {verbs: ['RESER'], action: [goto, LOC_RESERVOIR]},
@@ -1414,7 +1340,7 @@ locations: !!omap
     conditions: {DEEP: true}
     travel: [
       {verbs: ['EAST'], action: [goto, LOC_KINGHALL]},
-      {verbs: ['WEST'], cond: [not, DRAGON, 0], action: [goto, LOC_SECRET5]},
+      {verbs: ['WEST'], cond: [not, DRAGON, DRAGON_BLOCKS], action: [goto, LOC_SECRET5]},
       {verbs: ['WEST'], action: [goto, LOC_SECRET6]},
       {verbs: ['D'], action: [goto, LOC_WIDEPLACE]},
     ]
@@ -1843,9 +1769,9 @@ locations: !!omap
     travel: [
       {verbs: ['SW'], action: [goto, LOC_WINDING]},
       {verbs: ['OVER', 'ACROS', 'CROSS', 'NE'], cond: [with, TROLL], action: ["speak", TROLL_BLOCKS]},
-      {verbs: ['OVER'], cond: [not, CHASM, 0], action: ["speak", BRIDGE_GONE]},
+      {verbs: ['OVER'], cond: [not, CHASM, TROLL_BRIDGE], action: ["speak", BRIDGE_GONE]},
       {verbs: ['OVER'], action: ["special", 3]},
-      {verbs: ['JUMP'], cond: [not, CHASM, 0], action: [goto, LOC_NOMAKE]},
+      {verbs: ['JUMP'], cond: [not, CHASM, TROLL_BRIDGE], action: [goto, LOC_NOMAKE]},
       {verbs: ['JUMP'], action: ["speak", CROSS_BRIDGE]},
     ]
 - LOC_WINDING:
@@ -2150,7 +2076,7 @@ locations: !!omap
     conditions: {DEEP: true}
     travel: [
       {verbs: ['NORTH', 'OUT'], action: [goto, LOC_DIFFERENT2]},
-      {verbs: ['SOUTH'], cond: [not, VEND, 0], action: [goto, LOC_ROUGHHEWN]},
+      {verbs: ['SOUTH'], cond: [not, VEND, VEND_BLOCKS], action: [goto, LOC_ROUGHHEWN]},
       {verbs: ['SOUTH'], action: [goto, LOC_BADDIRECTION]},
     ]
 - LOC_ROUGHHEWN:
@@ -2473,7 +2399,7 @@ locations: !!omap
     conditions: {FLUID: true, DEEP: true}
     sound: WATERS_CRASHING
     travel: [
-      {verbs: ['SOUTH', 'ACROS', 'CROSS'], cond: [not, RESER, 1], action: ["speak", BAD_DIRECTION]},
+      {verbs: ['SOUTH', 'ACROS', 'CROSS'], cond: [not, RESER, WATERS_PARTED], action: ["speak", BAD_DIRECTION]},
       {verbs: ['SOUTH'], action: [goto, LOC_RESBOTTOM]},
       {verbs: ['NW', 'UPWAR', 'OUT'], action: [goto, LOC_TREACHEROUS]},
     ]
@@ -2606,7 +2532,7 @@ locations: !!omap
 
 arbitrary_messages:  !!omap
 - NO_MESSAGE: !!null
-- CAVE_NEARBY: 'Somewhere nearby is Colossal Cave, where others have found fortunes in\ntreasure and gold, though it is rumored that some who enter are never\nseen again.  Magic is said to work in the cave.  I will be your eyes\nand hands.  Direct me with commands of 1 or 2 words.  I should warn\nyou that I look at only the first five letters of each word, so you''ll\nhave to enter "northeast" as "ne" to distinguish it from "north".\nYou can type "help" for some general hints.  For information on how\nto end your adventure, scoring, etc., type "info".\n\t\t\t      - - -\nThis program was originally developed by Willie Crowther.  Most of the\nfeatures of the current program were added by Don Woods.  Contact Don\nif you have any questions, comments, etc.'
+- CAVE_NEARBY: 'Somewhere nearby is Colossal Cave, where others have found fortunes in\ntreasure and gold, though it is rumored that some who enter are never\nseen again.  Magic is said to work in the cave.  I will be your eyes\nand hands.  Direct me with commands of 1 or 2 words.  I should warn\nyou that I look at only the first five letters of each word, so you''ll\nhave to enter "northeast" as "ne" to distinguish it from "north".\nYou can type "help" for some general hints.  For information on how\nto end your adventure, scoring, etc., type "info".\n\t\t\t      - - -\nThis program was originally developed by Willie Crowther.  Most of the\nfeatures of the current program were added by Don Woods.'
 - DWARF_BLOCK: 'A little dwarf with a big knife blocks your way.'
 - DWARF_RAN: 'A little dwarf just walked around a corner, saw you, threw a little\naxe at you which missed, cursed, and ran away.'
 - DWARF_PACK: 'There are %d threatening little dwarves in the room with you.'
@@ -2623,10 +2549,6 @@ arbitrary_messages:  !!omap
 - NO_MORE_DETAIL: 'Sorry, but I am not allowed to give more detail.  I will repeat the\nlong description of your location.'
 - PITCH_DARK: 'It is now pitch dark.  If you proceed you will likely fall into a pit.'
 - W_IS_WEST: 'If you prefer, simply type w rather than west.'
-- ARB_18: !!null
-- ARB_19: !!null
-- ARB_20: !!null
-- ARB_21: !!null
 - REALLY_QUIT: 'Do you really want to quit now?'
 - PIT_FALL: 'You fell into a pit and broke every bone in your body!'
 - ALREADY_CARRYING: 'You are already carrying it!'
@@ -2640,12 +2562,8 @@ arbitrary_messages:  !!omap
 - NO_LOCK: 'It has no lock.'
 - NOT_LOCKABLE: 'I don''t know how to lock or unlock such a thing.'
 - ALREADY_LOCKED: 'It was already locked.'
-- GRATE_LOCKED: 'The grate is now locked.'
-- GRATE_UNLOCKED: 'The grate is now unlocked.'
 - ALREADY_UNLOCKED: 'It was already unlocked.'
 - URN_EMPTY: 'The urn is empty and will not light.'
-- LAMP_ON: 'Your lamp is now on.'
-- LAMP_OFF: 'Your lamp is now off.'
 - BEAR_BLOCKS: 'There is no way to get past the bear to unlock the chain, which is\nprobably just as well.'
 - NOTHING_HAPPENS: 'Nothing happens.'
 - WHERE_QUERY: 'Where?'
@@ -2667,8 +2585,6 @@ arbitrary_messages:  !!omap
 - NEARBY: 'I can only tell you what you see as you move about and manipulate\nthings.  I cannot tell you where remote things are.'
 - OGRE_SNARL: 'The ogre snarls and shoves you back.'
 - HUH_MAN: 'Huh?'
-- ARB_62: !!null
-- ARB_63: !!null
 - FOREST_LOOK: 'The trees of the forest are large hardwood oak and maple, with an\noccasional grove of pine or spruce.  There is quite a bit of under-\ngrowth, largely birch and ash saplings plus nondescript bushes of\nvarious sorts.  This time of year visibility is quite restricted by\nall the leaves, but travel is quite easy if you detour around the\nspruce and berry bushes.'
 - WELCOME_YOU: 'Welcome to Adventure!!  Would you like instructions?'
 - DIGGING_FUTILE: 'Digging without a shovel is quite impractical.  Even with a shovel\nprogress is unlikely.'
@@ -2686,16 +2602,6 @@ arbitrary_messages:  !!omap
 - CANT_POUR: 'You can''t pour that.'
 - WATCH_IT: 'Watch it!'
 - WHICH_WAY: 'Which way?'
-- ARB_81: !!null
-- ARB_82: !!null
-- ARB_83: !!null
-- ARB_84: !!null
-- ARB_85: !!null
-- ARB_86: !!null
-- ARB_87: !!null
-- ARB_88: !!null
-- ARB_89: !!null
-- ARB_90: !!null
 - FORGOT_PATH: 'Sorry, but I no longer seem to remember how it was you got here.'
 - CARRY_LIMIT: 'You can''t carry anything more.  You''ll have to drop something first.'
 - GRATE_NOWAY: 'You can''t go through a locked steel grate!'
@@ -2771,6 +2677,7 @@ arbitrary_messages:  !!omap
 - TROLL_SCAMPERS: 'The bear lumbers toward the troll, who lets out a startled shriek and\nscurries away.  The bear soon gives up the pursuit and wanders back.'
 - AXE_LOST: 'The axe misses and lands near the bear where you can''t get at it.'
 - BEAR_HANDS: 'With what?  Your bare hands?  Against *HIS* bear hands??'
+# The following three messages must be contiguous
 - BEAR_CONFUSED: 'The bear is confused; he only wants to be your friend.'
 - ALREADY_DEAD: 'For crying out loud, the poor thing is already dead!'
 - BEAR_TAMED: 'The bear eagerly wolfs down your food, after which he seems to calm\ndown considerably and even becomes rather friendly.'
@@ -2781,12 +2688,6 @@ arbitrary_messages:  !!omap
 - NO_LOCKSITE: 'There is nothing here to which the chain can be locked.'
 - NO_EDIBLES: 'There is nothing here to eat.'
 - WANT_HINT: 'Do you want the hint?'
-- ARB_176: !!null
-- ARB_177: !!null
-- ARB_178: !!null
-- ARB_179: !!null
-- ARB_180: !!null
-- ARB_181: !!null
 - TROLL_VICES: 'Gluttony is not one of the troll''s vices.  Avarice, however, is.'
 - LAMP_DIM: 'Your lamp is getting dim.  You''d best start wrapping this up, unless\nyou can find some fresh batteries.  I seem to recall there''s a vending\nmachine in the maze.  Bring some coins with you.'
 - LAMP_OUT: 'Your lamp has run out of power.'
@@ -2796,10 +2697,8 @@ arbitrary_messages:  !!omap
 - REPLACE_BATTERIES: 'Your lamp is getting dim.  I''m taking the liberty of replacing the\nbatteries.'
 - 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.'
-- ARB_191: !!null
 - 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?'
 - WAYOUT_CLUE: 'It says, "There is a way out of this place.  Do you need any more\ninformation to escape?  Sorry, but this initial hint is all you get."'
-- ARB_194: !!null
 - DONT_UNDERSTAND: 'I''m afraid I don''t understand.'
 - HAND_PASSTHROUGH: 'Your hand passes through it as though it weren''t there.'
 - BREAK_MIRROR: 'You strike the mirror a resounding blow, whereupon it shatters into a\nmyriad tiny fragments.'
@@ -2812,6 +2711,7 @@ arbitrary_messages:  !!omap
 - OGRE_DODGE: 'The ogre, who despite his bulk is quite agile, easily dodges your\nattack.  He seems almost amused by your puny effort.'
 - OGRE_PANIC1: 'The ogre, distracted by your rush, is struck by the knife.  With a\nblood-curdling yell he turns and bounds after the dwarves, who flee\nin panic.  You are left alone in the room.'
 - OGRE_PANIC2: 'The ogre, distracted by your rush, is struck by the knife.  With a\nblood-curdling yell he turns and bounds after the dwarf, who flees\nin panic.  You are left alone in the room.'
+# Following three messages must be contiguous
 - FREE_FLY: 'The bird flies about agitatedly for a moment.'
 - CAGE_FLY: 'The bird flies agitatedly about the cage.'
 - NECKLACE_FLY: 'The bird flies about agitatedly for a moment, then disappears through\nthe crack.  It reappears shortly, carrying in its beak a jade\nnecklace, which it drops at your feet.'
@@ -2849,12 +2749,9 @@ arbitrary_messages:  !!omap
 - HEAD_BUZZES: 'Your head buzzes strangely for a moment.'
 - NOT_BRIGHT: '(Uh, y''know, that wasn''t very bright.)'
 - TOOK_LONG: 'It''s a pity you took so long about it.'
-- ARB_244: !!null
-- ARB_245: !!null
 - UPSTREAM_DOWNSTREAM: 'Upstream or downstream?'
 - WIZARDS_NODISTURB: 'Wizards are not to be disturbed by such as you.'
 - FOREST_QUERY: !!null
-- ARB_249: !!null
 - WATERS_CRASHING: 'The waters are crashing loudly against the shore.'
 - THROWN_KNIVES: '%d of them throw knives at you!'
 - MULTIPLE_HITS: '%d of them get you!'
@@ -2879,15 +2776,11 @@ arbitrary_messages:  !!omap
 # 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.'
-- ARB_274: !!null
-- ARB_275: !!null
 - TWIST_TURN: 'Sorry, but the path twisted and turned so much that I can''t figure\nout which way to go to get back.'
 - 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.'
-- ARB_279: !!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.'
-  
+- ADVENTURE_VERSION: 'There is a puff of orange smoke; within it, fiery runes spell out:\n\n\tOpen Adventure %V - http://www.catb.org/esr/open-adventure/'
+
 classes: 
 - threshold: 0
   message: !!null
@@ -2929,59 +2822,65 @@ turn_thresholds:
 objects: !!omap
 - OBJ_0:
     inventory: !!null
-    longs: !!null
+    descriptions: !!null
 - KEYS:
     words: ['keys', 'key']
     inventory: 'Set of keys'
     locations: LOC_BUILDING
-    longs:
+    descriptions:
     - 'There are some keys on the ground here.'
 - LAMP:
     words: ['lamp', 'lante']
     inventory: 'Brass lantern'
     locations: LOC_BUILDING
-    longs:
+    descriptions:
     - [LAMP_DARK, 'There is a shiny brass lamp nearby.']
     - [LAMP_BRIGHT, 'There is a lamp shining nearby.']
+    changes:
+    - 'Your lamp is now off.'
+    - 'Your lamp is now on.'
 - GRATE:
     words: ['grate']
     inventory: '*grate'
     locations: [LOC_GRATE, LOC_BELOWGRATE]
     immovable: true
-    longs:
+    descriptions:
     - [GRATE_CLOSED, 'The grate is locked.']
     - [GRATE_OPEN, 'The grate is open.']
+    changes:
+    - 'The grate is now locked.'
+    - 'The grate is now unlocked.'
 - CAGE:
     words: ['cage']
     inventory: 'Wicker cage'
     locations: LOC_COBBLE
-    longs:
+    descriptions:
     - 'There is a small wicker cage discarded nearby.'
 - ROD:
     words: ['rod']
     inventory: 'Black rod'
     locations: LOC_DEBRIS
-    longs:
+    descriptions:
     - 'A three foot black rod with a rusty star on an end lies nearby.'
 - ROD2:
     words: ['rod']
     inventory: 'Black rod'
     locations: LOC_NOWHERE
-    longs:
+    descriptions:
     - 'A three foot black rod with a rusty mark on an end lies nearby.'
 - STEPS:
     words: ['steps']
     inventory: '*steps'
     locations: [LOC_PITTOP, LOC_MISTHALL]
     immovable: true
-    longs:
+    descriptions:
     - 'Rough stone steps lead down the pit.'
     - 'Rough stone steps lead up the dome.'
 - BIRD:
     words: ['bird']
     inventory: 'Little bird in cage'
     locations: LOC_BIRD
-    longs:
+    descriptions:
     - [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.']
@@ -2997,23 +2896,23 @@ objects: !!omap
     inventory: '*rusty door'
     locations: LOC_IMMENSE
     immovable: true
-    longs:
+    descriptions:
     - 'The way north is barred by a massive, rusty, iron door.'
     - 'The way north leads through a massive, rusty, iron door.'
 - PILLOW:
     words: ['pillo', 'velve']
     inventory: 'Velvet pillow'
     locations: LOC_SOFTROOM
-    longs:
+    descriptions:
     - 'A small velvet pillow lies on the floor.'
 - SNAKE:
     words: ['snake']
     inventory: '*snake'
     locations: LOC_KINGHALL
     immovable: true
-    longs:
-    - 'A huge green fierce snake bars the way!'
-    - '' # chased away
+    descriptions:
+    - [SNAKE_BLOCKS, 'A huge green fierce snake bars the way!']
+    - [SNAKE_CHASED, ''] # chased away
     sounds:
     - 'The snake is hissing venomously.'
 - FISSURE:
@@ -3021,16 +2920,16 @@ objects: !!omap
     inventory: '*fissure'
     locations: [LOC_EASTBANK, LOC_WESTBANK]
     immovable: true
-    longs:
-    - ''
-    - 'A crystal bridge now spans the fissure.'
-    - 'The crystal bridge has vanished!'
+    descriptions:
+    - [UNBRIDGED, '']
+    - [BRIDGED, 'A crystal bridge now spans the fissure.']
+    - [VANISHED, 'The crystal bridge has vanished!']
 - OBJ_13:
     words: ['table']
     inventory: '*stone tablet'
     locations: LOC_DARKROOM
     immovable: true
-    longs:
+    descriptions:
     - '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!"'
@@ -3038,7 +2937,7 @@ objects: !!omap
     words: ['clam']
     inventory: 'Giant clam  >GRUNT!<'
     locations: LOC_SHELLROOM
-    longs:
+    descriptions:
     - 'There is an enormous clam here with its shell tightly closed.'
     sounds:
     - 'The clam is as tight-mouthed as a, er, clam.'
@@ -3046,17 +2945,17 @@ objects: !!omap
     words: ['oyste']
     inventory: 'Giant oyster  >GROAN!<'
     locations: LOC_NOWHERE
-    longs:
+    descriptions:
     - '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?'
 - MAGAZINE:
-    words: ['issue', 'spelu', '"spel']
+    words: ['magaz', 'issue', 'spelu', '"spel']
     inventory: '"Spelunker Today"'
     locations: LOC_ANTEROOM
-    longs:
+    descriptions:
     - '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."'
@@ -3065,23 +2964,23 @@ objects: !!omap
     inventory: !!null
     locations: LOC_NOWHERE
     immovable: true
-    longs: !!null
+    descriptions: !!null
 - KNIFE:
     words: ['knife', 'knive']
     inventory: !!null
     locations: LOC_NOWHERE
-    longs: !!null
+    descriptions: !!null
 - FOOD:
     words: ['food', 'ratio']
     inventory: 'Tasty food'
     locations: LOC_BUILDING
-    longs:
+    descriptions:
     - 'There is food here.'
 - BOTTLE:
     words: ['bottl', 'jar']
     inventory: 'Small bottle'
     locations: LOC_BUILDING
-    longs:
+    descriptions:
     - [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.']
@@ -3089,24 +2988,24 @@ objects: !!omap
     words: ['water', 'h2o']
     inventory: 'Water in the bottle'
     locations: LOC_NOWHERE
-    longs: !!null
+    descriptions: !!null
 - OIL:
     words: ['oil']
     inventory: 'Oil in the bottle'
     locations: LOC_NOWHERE
-    longs: !!null
+    descriptions: !!null
 - MIRROR:
     words: ['mirro']
     inventory: '*mirror'
     locations: LOC_MIRRORCANYON
     immovable: true
-    longs: !!null
+    descriptions: !!null
 - PLANT:
     words: ['plant', 'beans']
     inventory: '*plant'
     locations: LOC_WESTPIT
     immovable: true
-    longs:
+    descriptions:
     - 'There is a tiny little plant in the pit, murmuring "water, water, ..."'
     - 'There is a 12-foot-tall beanstalk stretching up out of the pit,\nbellowing "WATER!! WATER!!"'
     - 'There is a gigantic beanstalk stretching all the way up to the hole.'
@@ -3122,7 +3021,7 @@ objects: !!omap
     inventory: '*phony plant' # seen in Twopit Room only when tall enough
     locations: [LOC_WESTEND, LOC_EASTEND]
     immovable: true
-    longs:
+    descriptions:
     - ''
     - 'The top of a 12-foot-tall beanstalk is poking out of the west pit.'
     - 'There is a huge beanstalk growing out of the west pit up to the hole.'
@@ -3131,20 +3030,20 @@ objects: !!omap
     inventory: '*stalactite'
     locations: LOC_TOPSTALACTITE
     immovable: true
-    longs:
+    descriptions:
     - ''
 - OBJ_27:
     words: ['shado', 'figur', 'windo']
     inventory: '*shadowy figure and/or window'
     locations: [LOC_WINDOW1, LOC_WINDOW2]
     immovable: true
-    longs:
+    descriptions:
     - 'The shadowy figure seems to be trying to attract your attention.'
 - AXE:
     words: ['axe']
     inventory: 'Dwarf''s axe'
     locations: LOC_NOWHERE
-    longs:
+    descriptions:
     - 'There is a little axe here.'
     - 'There is a little axe lying beside the bear.'
 - OBJ_29:
@@ -3152,20 +3051,20 @@ objects: !!omap
     inventory: '*cave drawings'
     locations: LOC_ORIENTAL
     immovable: true
-    longs: !!null
+    descriptions: !!null
 - OBJ_30:
     words: ['pirat', 'genie', 'djinn']
     inventory: '*pirate/genie'
     locations: LOC_NOWHERE
     immovable: true
-    longs: !!null # never present
+    descriptions: !!null # never present
 - DRAGON:
     words: ['drago']
     inventory: '*dragon'
     locations: [LOC_SECRET4, LOC_SECRET6]
     immovable: true
-    longs:
-    - 'A huge green fierce dragon bars the way!'
+    descriptions:
+    - [DRAGON_BLOCKS, 'A huge green fierce dragon bars the way!']
     - '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?)'
@@ -3178,15 +3077,15 @@ objects: !!omap
     inventory: '*chasm'
     locations: [LOC_SWCHASM, LOC_NECHASM]
     immovable: true
-    longs:
-    - 'A rickety wooden bridge extends across the chasm, vanishing into the\nmist.  A notice posted on the bridge reads, "Stop! Pay troll!"'
-    - 'The wreckage of a bridge (and a dead bear) can be seen at the bottom\nof the chasm.'
+    descriptions:
+    - [TROLL_BRIDGE, 'A rickety wooden bridge extends across the chasm, vanishing into the\nmist.  A notice posted on the bridge reads, "Stop! Pay troll!"']
+    - [BRIDGE_WRECKED, 'The wreckage of a bridge (and a dead bear) can be seen at the bottom\nof the chasm.']
 - TROLL:
     words: ['troll']
     inventory: '*troll'
     locations: [LOC_SWCHASM, LOC_NECHASM]
     immovable: true
-    longs:
+    descriptions:
     - '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
@@ -3197,24 +3096,24 @@ objects: !!omap
     inventory: '*phony troll'
     locations: [LOC_NOWHERE, LOC_NOWHERE]
     immovable: true
-    longs:
+    descriptions:
     - 'The troll is nowhere to be seen.'
 - BEAR:
     words: ['bear']
     inventory: !!null # bear uses rtext 141
     locations: LOC_BARRENROOM
     immovable: true
-    longs:
-    - 'There is a ferocious cave bear eying you from the far end of the room!'
-    - 'There is a gentle cave bear sitting placidly in one corner.'
-    - 'There is a contented-looking bear wandering about nearby.'
-    - '' # dead
+    descriptions:
+    - [UNTAMED_BEAR, 'There is a ferocious cave bear eying you from the far end of the room!']
+    - [SITTING_BEAR, 'There is a gentle cave bear sitting placidly in one corner.']
+    - [CONTENTED_BEAR, 'There is a contented-looking bear wandering about nearby.']
+    - [BEAR_DEAD, '']
 - MESSAG:
     words: ['messa']
     inventory: '*message in second maze'
     locations: LOC_NOWHERE
     immovable: true
-    longs:
+    descriptions:
     - '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."'
@@ -3223,15 +3122,18 @@ objects: !!omap
     inventory: '*volcano and/or geyser'
     locations: LOC_BREATHTAKING
     immovable: true
-    longs: !!null
+    descriptions: !!null
 - VEND:
     words: ['machi', 'vendi']
     inventory: '*vending machine'
     locations: LOC_DEADEND13
     immovable: true
-    longs:
+    descriptions:
     - [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.']
+    changes:
+    - 'The vending machine swings back to block the passage.'
+    - 'As you strike the vending machine, it pivots backward along with a\nsection of wall, revealing a dark passage leading south.'
     texts:
     - '"Drop coins here to receive fresh batteries."'
     - '"Drop coins here to receive fresh batteries."'
@@ -3239,7 +3141,7 @@ objects: !!omap
     words: ['batte']
     inventory: 'Batteries'
     locations: LOC_NOWHERE
-    longs:
+    descriptions:
     - [FRESH_BATTERIES, 'There are fresh batteries here.']
     - [DEAD_BATTERIES, 'Some worn-out batteries have been discarded nearby.']
 - OBJ_40:
@@ -3247,13 +3149,13 @@ objects: !!omap
     inventory: '*carpet and/or moss and/or curtains'
     locations: LOC_SOFTROOM
     immovable: true
-    longs: !!null
+    descriptions: !!null
 - OGRE:
     words: ['ogre']
     inventory: '*ogre'
     locations: LOC_LARGE
     immovable: true
-    longs:
+    descriptions:
     - 'A formidable ogre bars the northern exit.'
     sounds:
     - 'The ogre is apparently the strong, silent type.'
@@ -3262,7 +3164,7 @@ objects: !!omap
     inventory: '*urn'
     locations: LOC_CLIFF
     immovable: true
-    longs:
+    descriptions:
     - 'A small urn is embedded in the rock.'
     - 'A small urn full of oil is embedded in the rock.'
     - 'A small oil flame extrudes from an urn embedded in the rock.'
@@ -3271,37 +3173,37 @@ objects: !!omap
     inventory: '*cavity'
     locations: LOC_NOWHERE
     immovable: true
-    longs:
-    - '' # something in it
-    - 'There is a small urn-shaped cavity in the rock.'
+    descriptions:
+    - [CAVITY_FULL, ''] # something in it
+    - [CAVITY_EMPTY, 'There is a small urn-shaped cavity in the rock.']
 - BLOOD:
     words: ['blood']
     inventory: '*blood'
     locations: LOC_NOWHERE
     immovable: true
-    longs:
+    descriptions:
     - '' # described with dragon
 - RESER:
     words: ['reser']
     inventory: '*reservoir'
     locations: [LOC_RESERVOIR, LOC_RESNORTH]
     immovable: true
-    longs:
+    descriptions:
     - ''
-    - 'The waters have parted to form a narrow path across the reservoir.'
+    - [WATERS_PARTED, 'The waters have parted to form a narrow path across the reservoir.']
     - 'The waters crash together again.'
 - OBJ_46:
     words: ['appen', 'lepor']
     inventory: 'Leporine appendage'
     locations: LOC_FOREST22
-    longs:
+    descriptions:
     - 'Your keen eye spots a severed leporine appendage lying on the ground.'
 - OBJ_47:
     words: ['mud']
     inventory: '*mud'
     locations: LOC_DEBRIS
     immovable: true
-    longs:
+    descriptions:
     - ''
     texts:
     - '"MAGIC WORD XYZZY"'
@@ -3310,7 +3212,7 @@ objects: !!omap
     inventory: '*note'
     locations: LOC_NUGGET
     immovable: true
-    longs:
+    descriptions:
     - ''
     texts:
     - '"You won''t get it up the steps"'
@@ -3319,7 +3221,7 @@ objects: !!omap
     inventory: '*sign'
     locations: LOC_ANTEROOM
     immovable: true
-    longs:
+    descriptions:
     - [INGAME_SIGN, '']
     - [ENDGAME_SIGN, '']
     texts:
@@ -3330,49 +3232,49 @@ objects: !!omap
     inventory: 'Large gold nugget'
     locations: LOC_NUGGET
     treasure: true
-    longs:
+    descriptions:
     - 'There is a large sparkling nugget of gold here!'
 - OBJ_51:
     words: ['diamo']
     inventory: 'Several diamonds'
     locations: LOC_WESTBANK
     treasure: true
-    longs:
+    descriptions:
     - 'There are diamonds here!'
 - OBJ_52:
     words: ['silve', 'bars']
     inventory: 'Bars of silver'
     locations: LOC_FLOORHOLE
     treasure: true
-    longs:
+    descriptions:
     - 'There are bars of silver here!'
 - OBJ_53:
     words: ['jewel']
     inventory: 'Precious jewelry'
     locations: LOC_SOUTHSIDE
     treasure: true
-    longs:
+    descriptions:
     - 'There is precious jewelry here!'
 - COINS:
     words: ['coins']
     inventory: 'Rare coins'
     locations: LOC_WESTSIDE
     treasure: true
-    longs:
+    descriptions:
     - 'There are many coins here!'
 - CHEST:
     words: ['chest', 'box', 'treas']
     inventory: 'Treasure chest'
     locations: LOC_NOWHERE
     treasure: true
-    longs:
+    descriptions:
     - 'The pirate''s treasure chest is here!'
 - EGGS:
     words: ['eggs', 'egg', 'nest']
     inventory: 'Golden eggs'
     locations: LOC_GIANTROOM
     treasure: true
-    longs:
+    descriptions:
     - 'There is a large nest here, full of golden eggs!'
     - 'The nest of golden eggs has vanished!'
     - 'Done!'
@@ -3381,14 +3283,14 @@ objects: !!omap
     inventory: 'Jeweled trident'
     locations: LOC_WATERFALL
     treasure: true
-    longs:
+    descriptions:
     - 'There is a jewel-encrusted trident here!'
 - VASE:
     words: ['vase', 'ming', 'shard', 'potte']
     inventory: 'Ming vase'
     locations: LOC_ORIENTAL
     treasure: true
-    longs:
+    descriptions:
     - [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.']
@@ -3398,7 +3300,7 @@ objects: !!omap
     inventory: 'Egg-sized emerald'
     locations: LOC_PLOVER
     treasure: true
-    longs:
+    descriptions:
     - 'There is an emerald here the size of a plover''s egg!'
     - 'There is an emerald resting in a small cavity in the rock!'
 - PYRAMID:
@@ -3406,14 +3308,14 @@ objects: !!omap
     inventory: 'Platinum pyramid'
     locations: LOC_DARKROOM
     treasure: true
-    longs:
+    descriptions:
     - 'There is a platinum pyramid here, 8 inches on a side!'
 - PEARL:
     words: ['pearl']
     inventory: 'Glistening pearl'
     locations: LOC_NOWHERE
     treasure: true
-    longs:
+    descriptions:
     - 'Off to one side lies a glistening pearl!'
 - RUG:
     words: ['rug', 'persi']
@@ -3421,7 +3323,7 @@ objects: !!omap
     locations: [LOC_SECRET4, LOC_SECRET6]
     immovable: true
     treasure: true
-    longs:
+    descriptions:
     - '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!'
@@ -3430,7 +3332,7 @@ objects: !!omap
     inventory: 'Rare spices'
     locations: LOC_BOULDERS2
     treasure: true
-    longs:
+    descriptions:
     - 'There are rare spices here!'
 - CHAIN:
     words: ['chain']
@@ -3438,7 +3340,7 @@ objects: !!omap
     locations: LOC_BARRENROOM
     immovable: true
     treasure: true
-    longs:
+    descriptions:
     - '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!'
@@ -3447,7 +3349,7 @@ objects: !!omap
     inventory: 'Giant ruby'
     locations: LOC_STOREROOM
     treasure: true
-    longs:
+    descriptions:
     - 'There is an enormous ruby here!'
     - 'There is a ruby resting in a small cavity in the rock!'
 - JADE:
@@ -3455,14 +3357,14 @@ objects: !!omap
     inventory: 'Jade necklace'
     locations: LOC_NOWHERE
     treasure: true
-    longs:
+    descriptions:
     - 'A precious jade necklace has been dropped here!'
 - AMBER:
     words: ['amber', 'gemst']
     inventory: 'Amber gemstone'
     locations: LOC_NOWHERE
     treasure: true
-    longs:
+    descriptions:
     - 'There is a rare amber gemstone here!'
     - 'There is an amber gemstone resting in a small cavity in the rock!'
 - SAPPH:
@@ -3470,7 +3372,7 @@ objects: !!omap
     inventory: 'Star sapphire'
     locations: LOC_LEDGE
     treasure: true
-    longs:
+    descriptions:
     - 'A brilliant blue star sapphire is here!'
     - 'There is a star sapphire resting in a small cavity in the rock!'
 - OBJ_69:
@@ -3478,7 +3380,7 @@ objects: !!omap
     inventory: 'Ebony statuette'
     locations: LOC_REACHDEAD
     treasure: true
-    longs:
+    descriptions:
     - 'There is a richly-carved ebony statuette here!'
 
 obituaries: