Comment polishing.
[open-adventure.git] / adventure.yaml
index 629060a40bc2b4868e194cfa845e033c0adffd48..e01ca5cc2629535c04855936d3a131590a8d8110 100644 (file)
@@ -6,19 +6,23 @@
 #
 # We define a bunch of YAML structures:
 #
-# 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.
+# vocabulary: 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.
 #
-# locations: They have attributes as follows...
+# hints: Each item contains a hint number, 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 (in
+#    arbitrary_messages) of the question, and the message number of
+#    the hint.
 #
-#    long:         Long description, always shown on first encounter.
-#    short:        Short description. If none, use long description.
-#    conditions:   A dictionary of attributes
+# 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.
-#
+#      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.
 #    All attributes are optional except the long description. Order of
 #    locations is not significant.
 #
 #    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.
-#    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.
+# 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.
 #
 # obituaries: Death messages and reincarnation queries.  Order is
 #    significant, they're used in succession as the player racks up
 #    deaths.
 #
-# 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.
+# These correspond to sections 1, 2, 4, 5, 6, 7, 9, 10, 11, 13, and 14 in
+# the old adventure.text format.  Sections 3 and 8 haven't moved
+# yet.  Section 12 was obsolete.
 #
 # Message strings may include certain special character sequences to
 # denote that the program must provide parameters to insert into a
 #      %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.
+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: "KEYS",  type: object, value: 1},
+    {word: "KEY",   type: object, value: 1},
+    {word: "LAMP",  type: object, value: 2},
+    {word: "LANTE", type: object, value: 2},
+    {word: "GRATE", type: object, value: 3},
+    {word: "CAGE",  type: object, value: 4},
+    {word: "ROD",   type: object, value: 5},
+    {word: "ROD",   type: object, value: 6}, # Must be next object after "real" rod
+    {word: "STEPS", type: object, value: 7},
+    {word: "BIRD",  type: object, value: 8},
+    {word: "DOOR",  type: object, value: 9},
+    {word: "PILLO", type: object, value: 10},
+    {word: "VELVE", type: object, value: 10},
+    {word: "SNAKE", type: object, value: 11},
+    {word: "FISSU", type: object, value: 12},
+    {word: "TABLE", type: object, value: 13},
+    {word: "CLAM",  type: object, value: 14},
+    {word: "OYSTE", type: object, value: 15},
+    {word: "MAGAZ", type: object, value: 16},
+    {word: "ISSUE", type: object, value: 16},
+    {word: "SPELU", type: object, value: 16},
+    {word: '"SPEL', type: object, value: 16},
+    {word: "DWARF", type: object, value: 17},
+    {word: "DWARV", type: object, value: 17},
+    {word: "KNIFE", type: object, value: 18},
+    {word: "KNIVE", type: object, value: 18},
+    {word: "FOOD",  type: object, value: 19},
+    {word: "RATIO", type: object, value: 19},
+    {word: "BOTTL", type: object, value: 20},
+    {word: "JAR",   type: object, value: 20},
+    {word: "WATER", type: object, value: 21},
+    {word: "H2O",   type: object, value: 21},
+    {word: "OIL",   type: object, value: 22},
+    {word: "MIRRO", type: object, value: 23},
+    {word: "PLANT", type: object, value: 24},
+    {word: "BEANS", type: object, value: 24},
+    {word: "PLANT", type: object, value: 25}, # Must be next object after "real" plant
+    {word: "STALA", type: object, value: 26},
+    {word: "SHADO", type: object, value: 27},
+    {word: "FIGUR", type: object, value: 27},
+    {word: "WINDO", type: object, value: 27}, # Same as figure
+    {word: "AXE",   type: object, value: 28},
+    {word: "DRAWI", type: object, value: 29},
+    {word: "PIRAT", type: object, value: 30},
+    {word: "GENIE", type: object, value: 30},
+    {word: "DJINN", type: object, value: 30},
+    {word: "DRAGO", type: object, value: 31},
+    {word: "CHASM", type: object, value: 32},
+    {word: "TROLL", type: object, value: 33},
+    {word: "TROLL", type: object, value: 34}, # Must be next object after "real" troll
+    {word: "BEAR",  type: object, value: 35},
+    {word: "MESSA", type: object, value: 36},
+    {word: "VOLCA", type: object, value: 37},
+    {word: "GEYSE", type: object, value: 37}, # Same as volcano
+    {word: "MACHI", type: object, value: 38},
+    {word: "VENDI", type: object, value: 38},
+    {word: "BATTE", type: object, value: 39},
+    {word: "CARPE", type: object, value: 40},
+    {word: "MOSS",  type: object, value: 40},
+    {word: "CURTA", type: object, value: 40}, # Same as carpet
+    {word: "OGRE",  type: object, value: 41},
+    {word: "URN",   type: object, value: 42},
+    {word: "CAVIT", type: object, value: 43},
+    {word: "BLOOD", type: object, value: 44},
+    {word: "RESER", type: object, value: 45}, # Verb overrides
+    {word: "APPEN", type: object, value: 46},
+    {word: "LEPOR", type: object, value: 46},
+    {word: "MUD",   type: object, value: 47},
+    {word: "NOTE",  type: object, value: 48},
+    {word: "SIGN",  type: object, value: 49},
+    {word: "GOLD",  type: object, value: 50},
+    {word: "NUGGE", type: object, value: 50},
+    {word: "DIAMO", type: object, value: 51},
+    {word: "SILVE", type: object, value: 52},
+    {word: "BARS",  type: object, value: 52},
+    {word: "JEWEL", type: object, value: 53},
+    {word: "COINS", type: object, value: 54},
+    {word: "CHEST", type: object, value: 55},
+    {word: "BOX",   type: object, value: 55},
+    {word: "TREAS", type: object, value: 55},
+    {word: "EGGS",  type: object, value: 56},
+    {word: "EGG",   type: object, value: 56},
+    {word: "NEST",  type: object, value: 56},
+    {word: "TRIDE", type: object, value: 57},
+    {word: "VASE",  type: object, value: 58},
+    {word: "MING",  type: object, value: 58},
+    {word: "SHARD", type: object, value: 58},
+    {word: "POTTE", type: object, value: 58},
+    {word: "EMERA", type: object, value: 59},
+    {word: "PLATI", type: object, value: 60},
+    {word: "PYRAM", type: object, value: 60},
+    {word: "PEARL", type: object, value: 61},
+    {word: "RUG",   type: object, value: 62},
+    {word: "PERSI", type: object, value: 62},
+    {word: "SPICE", type: object, value: 63},
+    {word: "CHAIN", type: object, value: 64},
+    {word: "RUBY",  type: object, value: 65},
+    {word: "JADE",  type: object, value: 66},
+    {word: "NECKL", type: object, value: 66},
+    {word: "AMBER", type: object, value: 67},
+    {word: "GEMST", type: object, value: 67},
+    {word: "SAPPH", type: object, value: 68},
+    {word: "EBONY", type: object, value: 69},
+    {word: "STATU", type: object, value: 69},
+    {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},
+]
+
 # FIXME: Hint texts shouldn't be in arbitrary_messages, but inlined here
 hints:
   - hint: &grate
@@ -1500,37 +1837,47 @@ object_descriptions: !!omap
     longs: !!null
 - OBJ_1:
     inventory: 'Set of keys'
+    locations: LOC_BUILDING
     longs:
     - 'There are some keys on the ground here.'
 - OBJ_2:
     inventory: 'Brass lantern'
+    locations: LOC_BUILDING
     longs:
     - [LAMP_DARK, 'There is a shiny brass lamp nearby.']
     - [LAMP_BRIGHT, 'There is a lamp shining nearby.']
 - OBJ_3:
     inventory: '*grate'
+    locations: [LOC_GRATE, LOC_BELOWGRATE]
+    immovable: true
     longs:
     - [GRATE_CLOSED, 'The grate is locked.']
     - [GRATE_OPEN, 'The grate is open.']
 - OBJ_4:
     inventory: 'Wicker cage'
+    locations: LOC_COBBLE
     longs:
     - 'There is a small wicker cage discarded nearby.'
 - OBJ_5:
     inventory: 'Black rod'
+    locations: LOC_DEBRIS
     longs:
     - 'A three foot black rod with a rusty star on an end lies nearby.'
 - OBJ_6:
     inventory: 'Black rod'
+    locations: LOC_NOWHERE
     longs:
     - 'A three foot black rod with a rusty mark on an end lies nearby.'
 - OBJ_7:
     inventory: '*steps'
+    locations: [LOC_PITTOP, LOC_MISTHALL]
+    immovable: true
     longs:
     - 'Rough stone steps lead down the pit.'
     - 'Rough stone steps lead up the dome.'
 - OBJ_8:
     inventory: 'Little bird in cage'
+    locations: LOC_BIRD
     longs:
     - [BIRD_UNCAGED, 'A cheerful little bird is sitting here singing.']
     - [BIRD_CAGED, 'There is a little bird in the cage.']
@@ -1544,15 +1891,20 @@ object_descriptions: !!omap
     - 'The bird is singing to you in gratitude for your having returned it to\nits home.  In return, it informs you of a magic word which it thinks\nyou may find useful somewhere near the Hall of Mists.  The magic word\nchanges frequently, but for now the bird believes it is "%s".  You\nthank the bird for this information, and it flies off into the forest.'
 - OBJ_9:
     inventory: '*rusty door'
+    locations: LOC_IMMENSE
+    immovable: true
     longs:
     - 'The way north is barred by a massive, rusty, iron door.'
     - 'The way north leads through a massive, rusty, iron door.'
 - OBJ_10:
     inventory: 'Velvet pillow'
+    locations: LOC_SOFTROOM
     longs:
     - 'A small velvet pillow lies on the floor.'
 - OBJ_11:
     inventory: '*snake'
+    locations: LOC_KINGHALL
+    immovable: true
     longs:
     - 'A huge green fierce snake bars the way!'
     - '' # chased away
@@ -1560,24 +1912,30 @@ object_descriptions: !!omap
     - 'The snake is hissing venomously.'
 - OBJ_12:
     inventory: '*fissure'
+    locations: [LOC_EASTBANK, LOC_WESTBANK]
+    immovable: true
     longs:
     - ''
     - 'A crystal bridge now spans the fissure.'
     - 'The crystal bridge has vanished!'
 - OBJ_13:
     inventory: '*stone tablet'
+    locations: LOC_DARKROOM
+    immovable: true
     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!<'
+    locations: LOC_SHELLROOM
     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!<'
+    locations: LOC_NOWHERE
     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.'
@@ -1586,37 +1944,49 @@ object_descriptions: !!omap
     - 'It says the same thing it did before.  Hm, maybe it''s a pun?'
 - OBJ_16:
     inventory: '"Spelunker Today"'
+    locations: LOC_ANTEROOM
     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
+    locations: LOC_NOWHERE
+    immovable: true
     longs: !!null
 - OBJ_18:
     inventory: !!null
+    locations: LOC_NOWHERE
     longs: !!null
 - OBJ_19:
     inventory: 'Tasty food'
+    locations: LOC_BUILDING
     longs:
     - 'There is food here.'
 - OBJ_20:
     inventory: 'Small bottle'
+    locations: LOC_BUILDING
     longs:
     - [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'
+    locations: LOC_NOWHERE
     longs: !!null
 - OBJ_22:
     inventory: 'Oil in the bottle'
+    locations: LOC_NOWHERE
     longs: !!null
 - OBJ_23:
     inventory: '*mirror'
+    locations: LOC_MIRRORCANYON
+    immovable: true
     longs: !!null
 - OBJ_24:
     inventory: '*plant'
+    locations: LOC_WESTPIT
+    immovable: true
     longs:
     - '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!!"'
@@ -1630,31 +2000,44 @@ object_descriptions: !!omap
     - 'The plant now maintains a contented silence.'
 - OBJ_25:
     inventory: '*phony plant' # seen in Twopit Room only when tall enough
+    locations: [LOC_WESTEND, LOC_EASTEND]
+    immovable: true
     longs:
     - ''
     - '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.'
 - OBJ_26:
     inventory: '*stalactite'
+    locations: LOC_TOPSTALACTITE
+    immovable: true
     longs:
     - ''
 - OBJ_27:
     inventory: '*shadowy figure and/or window'
+    locations: [LOC_WINDOW1, LOC_WINDOW2]
+    immovable: true
     longs:
     - 'The shadowy figure seems to be trying to attract your attention.'
 - OBJ_28:
     inventory: 'Dwarf''s axe'
+    locations: LOC_NOWHERE
     longs:
     - 'There is a little axe here.'
     - 'There is a little axe lying beside the bear.'
 - OBJ_29:
     inventory: '*cave drawings'
+    locations: LOC_ORIENTAL
+    immovable: true
     longs: !!null
 - OBJ_30:
     inventory: '*pirate/genie'
+    locations: LOC_NOWHERE
+    immovable: true
     longs: !!null # never present
 - OBJ_31:
     inventory: '*dragon'
+    locations: [LOC_SECRET4, LOC_SECRET6]
+    immovable: true
     longs:
     - 'A huge green fierce dragon bars the way!'
     - 'The blood-specked body of a huge green dead dragon lies to one side.'
@@ -1666,11 +2049,15 @@ object_descriptions: !!omap
     - 'The dragon is, not surprisingly, silent.'
 - OBJ_32:
     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.'
 - OBJ_33:
     inventory: '*troll'
+    locations: [LOC_SWCHASM, LOC_NECHASM]
+    immovable: true
     longs:
     - '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.'
@@ -1679,10 +2066,14 @@ object_descriptions: !!omap
     - 'The troll sounds quite adamant in his demand for a treasure.'
 - OBJ_34:
     inventory: '*phony troll'
+    locations: [LOC_NOWHERE, LOC_NOWHERE]
+    immovable: true
     longs:
     - 'The troll is nowhere to be seen.'
 - OBJ_35:
     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.'
@@ -1690,15 +2081,21 @@ object_descriptions: !!omap
     - '' # dead
 - OBJ_36:
     inventory: '*message in second maze'
+    locations: LOC_NOWHERE
+    immovable: true
     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'
+    locations: LOC_BREATHTAKING
+    immovable: true
     longs: !!null
 - OBJ_38:
     inventory: '*vending machine'
+    locations: LOC_DEADEND13
+    immovable: true
     longs:
     - [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.']
@@ -1707,57 +2104,77 @@ object_descriptions: !!omap
     - '"Drop coins here to receive fresh batteries."'
 - OBJ_39:
     inventory: 'Batteries'
+    locations: LOC_NOWHERE
     longs:
     - [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'
+    locations: LOC_SOFTROOM
+    immovable: true
     longs: !!null
 - OBJ_41:
     inventory: '*ogre'
+    locations: LOC_LARGE
+    immovable: true
     longs:
     - 'A formidable ogre bars the northern exit.'
     sounds:
     - 'The ogre is apparently the strong, silent type.'
 - OBJ_42:
     inventory: '*urn'
+    locations: LOC_CLIFF
+    immovable: true
     longs:
     - '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.'
 - OBJ_43:
     inventory: '*cavity'
+    locations: LOC_NOWHERE
+    immovable: true
     longs:
     - '' # something in it
     - 'There is a small urn-shaped cavity in the rock.'
 - OBJ_44:
     inventory: '*blood'
+    locations: LOC_NOWHERE
+    immovable: true
     longs:
     - '' # described with dragon
 - OBJ_45:
     inventory: '*reservoir'
+    locations: [LOC_RESERVOIR, LOC_RESNORTH]
+    immovable: true
     longs:
     - ''
     - 'The waters have parted to form a narrow path across the reservoir.'
     - 'The waters crash together again.'
 - OBJ_46:
     inventory: 'Leporine appendage'
+    locations: LOC_FOREST22
     longs:
     - 'Your keen eye spots a severed leporine appendage lying on the ground.'
 - OBJ_47:
     inventory: '*mud'
+    locations: LOC_DEBRIS
+    immovable: true
     longs:
     - ''
     texts:
     - '"MAGIC WORD XYZZY"'
 - OBJ_48:
     inventory: '*note'
+    locations: LOC_NUGGET
+    immovable: true
     longs:
     - ''
     texts:
     - '"You won''t get it up the steps"'
 - OBJ_49:
     inventory: '*sign'
+    locations: LOC_ANTEROOM
+    immovable: true
     longs:
     - [INGAME_SIGN, '']
     - [ENDGAME_SIGN, '']
@@ -1766,36 +2183,43 @@ object_descriptions: !!omap
     - '"Treasure Vault.  Keys in main office."'
 - OBJ_50:
     inventory: 'Large gold nugget'
+    locations: LOC_NUGGET
     treasure: true
     longs:
     - 'There is a large sparkling nugget of gold here!'
 - OBJ_51:
     inventory: 'Several diamonds'
+    locations: LOC_WESTBANK
     treasure: true
     longs:
     - 'There are diamonds here!'
 - OBJ_52:
     inventory: 'Bars of silver'
+    locations: LOC_FLOORHOLE
     treasure: true
     longs:
     - 'There are bars of silver here!'
 - OBJ_53:
     inventory: 'Precious jewelry'
+    locations: LOC_SOUTHSIDE
     treasure: true
     longs:
     - 'There is precious jewelry here!'
 - OBJ_54:
     inventory: 'Rare coins'
+    locations: LOC_WESTSIDE
     treasure: true
     longs:
     - 'There are many coins here!'
 - OBJ_55:
     inventory: 'Treasure chest'
+    locations: LOC_NOWHERE
     treasure: true
     longs:
     - 'The pirate''s treasure chest is here!'
 - OBJ_56:
     inventory: 'Golden eggs'
+    locations: LOC_GIANTROOM
     treasure: true
     longs:
     - 'There is a large nest here, full of golden eggs!'
@@ -1803,11 +2227,13 @@ object_descriptions: !!omap
     - 'Done!'
 - OBJ_57:
     inventory: 'Jeweled trident'
+    locations: LOC_WATERFALL
     treasure: true
     longs:
     - 'There is a jewel-encrusted trident here!'
 - OBJ_58:
     inventory: 'Ming vase'
+    locations: LOC_ORIENTAL
     treasure: true
     longs:
     - [VASE_WHOLE, 'There is a delicate, precious, ming vase here!']
@@ -1816,22 +2242,27 @@ object_descriptions: !!omap
     - [VASE_DROPS, 'The ming vase drops with a delicate crash.']
 - OBJ_59:
     inventory: 'Egg-sized emerald'
+    locations: LOC_PLOVER
     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'
+    locations: LOC_DARKROOM
     treasure: true
     longs:
     - 'There is a platinum pyramid here, 8 inches on a side!'
 - OBJ_61:
     inventory: 'Glistening pearl'
+    locations: LOC_NOWHERE
     treasure: true
     longs:
     - 'Off to one side lies a glistening pearl!'
 - OBJ_62:
     inventory: 'Persian rug'
+    locations: [LOC_SECRET4, LOC_SECRET6]
+    immovable: true
     treasure: true
     longs:
     - 'There is a persian rug spread out on the floor!'
@@ -1839,11 +2270,14 @@ object_descriptions: !!omap
     - 'There is a persian rug here, hovering in mid-air!'
 - OBJ_63:
     inventory: 'Rare spices'
+    locations: LOC_BOULDERS2
     treasure: true
     longs:
     - 'There are rare spices here!'
 - OBJ_64:
     inventory: 'Golden chain'
+    locations: LOC_BARRENROOM
+    immovable: true
     treasure: true
     longs:
     - 'There is a golden chain lying in a heap on the floor!'
@@ -1851,29 +2285,34 @@ object_descriptions: !!omap
     - 'There is a golden chain locked to the wall!'
 - OBJ_65:
     inventory: 'Giant ruby'
+    locations: LOC_STOREROOM
     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'
+    locations: LOC_NOWHERE
     treasure: true
     longs:
     - 'A precious jade necklace has been dropped here!'
 - OBJ_67:
     inventory: 'Amber gemstone'
+    locations: LOC_NOWHERE
     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'
+    locations: LOC_LEDGE
     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'
+    locations: LOC_REACHDEAD
     treasure: true
     longs:
     - 'There is a richly-carved ebony statuette here!'