home *** CD-ROM | disk | FTP | other *** search
/ Fatal Distractions! / fataldistractions.bin / chap01 / ccr / ccr-room.t < prev    next >
Text File  |  1993-07-10  |  115KB  |  4,603 lines

  1. /*
  2.  * Colossal Cave Revisited
  3.  *
  4.  * A remake of Willie Crowther and Don Woods' classic Adventure.
  5.  * Converted from Donald Ekman's PC port of the original FORTRAN source.
  6.  * TADS version by David M. Baggett for ADVENTIONS.
  7.  *
  8.  * Please document all changes in the history so we know who did what.
  9.  *
  10.  * This source code is copylefted under the terms of the GNU Public
  11.  * License.  Essentially, this means that you are free to do whatever
  12.  * you wish with this source code, provided you do not charge any
  13.  * money for it or for any derivative works.
  14.  *
  15.  * ADVENTIONS distributes this game, but you are free to do what you will
  16.  * with it, provided you adhere to the terms in the GNU Public License.
  17.  * Send correspondence regarding this game or original works distributed
  18.  * by ADVENTIONS to 
  19.  *
  20.  *    ADVENTIONS
  21.  *    PO Box 851
  22.  *    Columbia, MD 21044
  23.  *
  24.  * If you would like a catalog of releases, please enclose a SASE.  Thanks!
  25.  *
  26.  * Contributors
  27.  *
  28.  *    dmb    In real life:    David M. Baggett
  29.  *        Internet:    <dmb@ai.mit.edu>
  30.  *        Compu$erve:    76440,2671 (ADVENTIONS account)
  31.  *        GEnie:        ADVENTIONS
  32.  *
  33.  * Modification History
  34.  *
  35.  *  1-Jan-93    dmb    rec.arts.int-fiction BETA release (source only)
  36.  *                      For beta testing only -- not for general
  37.  *            distribution.
  38.  * 20-Apr-93    dmb    Added the stream decoration to Inside_Building
  39.  *            you can get water there.
  40.  *
  41.  */
  42.  
  43. /*
  44.  * This file defines all the locations.
  45.  */
  46.  
  47. /*
  48.  * First we need to define a new class for our rooms.
  49.  * In the original fortran version of the game, you could move around
  50.  * by naming adjacent places.  Since we want to retain this capability,
  51.  * we need to augment the existing set of room movement methods.
  52.  *
  53.  * We also make rooms dark by default.
  54.  *
  55.  * We also need a few things to help our NPC's move about the cave
  56.  * without getting stuck or wandering where they're not supposed to.
  57.  *
  58.  * IMPORTANT NOTE: If you add exit properties (i.e., things like
  59.  * out, east, down, etc.), be sure to update the exitlist in ccr-npc.t
  60.  * or NPC's won't know to look at them, and might get stuck!
  61.  */
  62. class CCR_room: darkroom
  63.     //
  64.     // By default, exits don't go anywhere.
  65.     //
  66.     // The directional ones call noexit, the standard TADS
  67.     // "You can't go that way" method.
  68.     //
  69.     // The magic words print "Nothing happens."
  70.     //
  71.     // For the other words, the game tells the player it
  72.     // doesn't know how to apply the word in the given
  73.     // location.
  74.     //
  75.     jump = { "I don't see how that will help here."; return nil; }
  76.  
  77.     //
  78.     // Directions
  79.     //
  80.     upstream = { return self.noexit; }
  81.     downstream = { return self.noexit; }
  82.     forwards = { return self.noexit; }
  83.     outdoors = { return self.noexit; }
  84.     left = { return self.noexit; }
  85.     right = { return self.noexit; }
  86.     cross = { return self.noexit; }
  87.     over = { return self.noexit; }
  88.     across = { return self.noexit; }
  89.  
  90.     //
  91.     // Magic words
  92.     //
  93.     // Note that it's important to have these implemented as travel
  94.     // verbs because once the cave closes, these stop working just
  95.     // like the usual travel verbs.
  96.     //
  97.     // Non-travel magic words are defined in ccr-verbs.t
  98.     //
  99.     xyzzy = { return self.nothinghappens; }
  100.     y2 = { return self.nothinghappens; }
  101.     plugh = { return self.nothinghappens; }
  102.     plover = { return self.nothinghappens; }
  103.  
  104.     //
  105.     // Feature names
  106.     //
  107.     // These allow limited teleporting to prominent locations.
  108.     //
  109.     road = { return self.doesnotapplyhere; }
  110.     forest = { return self.doesnotapplyhere; }
  111.     valley = { return self.doesnotapplyhere; }
  112.     stairs = { return self.doesnotapplyhere; }
  113.     building = { return self.doesnotapplyhere; }
  114.     gully = { return self.doesnotapplyhere; }
  115.     stream = { return self.doesnotapplyhere; }
  116.     rock = { return self.doesnotapplyhere; }
  117.     bed = { return self.doesnotapplyhere; }
  118.     crawl = { return self.doesnotapplyhere; }
  119.     cobble = { return self.doesnotapplyhere; }
  120.     tosurface = { return self.doesnotapplyhere; }
  121.     dark = { return self.doesnotapplyhere; }
  122.     passage = { return self.doesnotapplyhere; }
  123.     low = { return self.doesnotapplyhere; }
  124.     canyon = { return self.doesnotapplyhere; }
  125.     awkward = { return self.doesnotapplyhere; }
  126.     giant = { return self.doesnotapplyhere; }
  127.     view = { return self.doesnotapplyhere; }
  128.     pit = { return self.doesnotapplyhere; }
  129.     crack = { return self.doesnotapplyhere; }
  130.     steps = { return self.doesnotapplyhere; }
  131.     dome = { return self.doesnotapplyhere; }
  132.     hall = { return self.doesnotapplyhere; }
  133.     barren = { return self.doesnotapplyhere; }
  134.     debris = { return self.doesnotapplyhere; }
  135.     hole = { return self.doesnotapplyhere; }
  136.     wall = { return self.doesnotapplyhere; }
  137.     broken = { return self.doesnotapplyhere; }
  138.     floor = { return self.doesnotapplyhere; }
  139.     toroom = { return self.doesnotapplyhere; }
  140.     slit = { return self.doesnotapplyhere; }
  141.     slab = { return self.doesnotapplyhere; }
  142.     depression = { return self.doesnotapplyhere; }
  143.     entrance = { return self.doesnotapplyhere; }
  144.     secret = { return self.doesnotapplyhere; }
  145.     cave = { return self.doesnotapplyhere; }
  146.     bedquilt = { return self.doesnotapplyhere; }
  147.     oriental = { return self.doesnotapplyhere; }
  148.     cavern = { return self.doesnotapplyhere; }
  149.     shell = { return self.doesnotapplyhere; }
  150.     reservoir = { return self.doesnotapplyhere; }
  151.     main = { return self.doesnotapplyhere; }
  152.     office = { return self.doesnotapplyhere; }
  153.     fork = { return self.doesnotapplyhere; }
  154.  
  155.     nothinghappens = {
  156.         "Nothing happens.";
  157.         return nil;
  158.     }
  159.     doesnotapplyhere = {
  160.         "I don't know how to apply that word here.";
  161.         return nil;
  162.     }
  163.  
  164.     //
  165.     // Exits for NPC's.  Since NPC's won't take regular exits
  166.     // that are methods (instead of simple object names), we
  167.     // have to add "hints" in some rooms to allow complete access
  168.     // to all rooms.  By default, these are all nil.  (Note that
  169.     // it is important for them to be nil ojects, and not methods
  170.     // that return nil.  If they are methods, NPC's will try them.)
  171.     //
  172.     NPCexit1 = nil
  173.     NPCexit2 = nil
  174.     NPCexit3 = nil
  175.     NPCexit4 = nil
  176.     NPCexit5 = nil
  177.     NPCexit6 = nil
  178.     NPCexit7 = nil
  179.     NPCexit8 = nil
  180.  
  181.     //
  182.     // Each room has a list of exit properties that can be considered by
  183.     // NPC's.  The lists is determined at preinit time by looking
  184.     // at all the exit methods and discarding those that are methods.
  185.     // (The NPCexits are always considered, whether they are methods
  186.     // or not, since they're guranteed not to print anything or
  187.     // change game state when they're run.)
  188.     //
  189.     // Note: the list doesn't contain locations; it contains properties;
  190.     // i.e., it contains [ &west &up ... ], not [ At_Y2 ... ].
  191.     //
  192.     NPCexits = []
  193. ;
  194.  
  195. /*
  196.  * A class for the rooms in the "alike" maze.
  197.  */
  198. class CCR_alike_maze_room: CCR_room
  199.     sdesc = "Maze of Twisty Little Passages, All Alike"
  200.     ldesc = {
  201.         I(); "You are in a maze of twisty little passages, 
  202.         all alike.";
  203.     }
  204. ;
  205.  
  206. /*
  207.  * A class for rooms that are forbidden to non-player characters.
  208.  * (This means dwarves and pirate, not bear.)
  209.  *
  210.  * All pits inherit this class because the original source claims
  211.  * that dwarves won't follow the player into a pit, even though
  212.  * they do.  It makes more sense for them to give up the chase
  213.  * when the player scrambles down into a pit, and for that matter
  214.  * it may sound a bit funny for a combat to occur in a little pit,
  215.   * so I've add NoNPC too all the pit rooms.
  216.  */
  217. class NoNPC: CCR_room
  218.     noNPCs = true
  219. ;
  220.  
  221. /*
  222.  * A class for the dead ends.
  223.  */
  224. class CCR_dead_end_room: CCR_room
  225.     sdesc = "At a Dead End"
  226.     ldesc = {
  227.         I(); "You have reached a dead end.";
  228.     }
  229. ;
  230.  
  231. /*
  232.  * A class for areas that are naturally lit.
  233.  */
  234. class lightroom: CCR_room
  235.     islit = true
  236. ;
  237.  
  238. /*
  239.  * A class for rooms that are outside.
  240.  * These rooms are off limits once the cave is closed.
  241.  */
  242. class Outside: CCR_room
  243.     isoutside = true
  244. ;
  245.  
  246. /*
  247.  * A class for rooms that aren't far enough in to earn the player
  248.  * the bonus for getting "well in."
  249.  *
  250.  * See the definition of Me in ccr-std.t for info on how this is used.
  251.  */
  252. class NotFarIn: CCR_room, NoNPC
  253.     notfarin = true
  254. ;
  255.  
  256. class CCR_decoration: decoration;
  257.  
  258. /*
  259.  * This class lets us easily define a decoration that's in multiple
  260.  * places at once.  You just list the locations it appears in in
  261.  * a list called loclist.
  262.  *
  263.  * This is particularly nice for things like water, which can be
  264.  * manipulated -- we only have one object name to consider (Stream)
  265.  * for all the water in the game that can be taken.  (See ioPutIn
  266.  * for the bottle in ccr-item.t)
  267.  */
  268. class floatingdecoration: CCR_decoration
  269.     locationOK = true    // OK for location to be method
  270.     location = {
  271.         if (find(self.loclist, Me.location))
  272.             return Me.location;
  273.         else
  274.             return nil;
  275.     }
  276. ;
  277.  
  278. /*
  279.  * The locations
  280.  */
  281. At_End_Of_Road: CCR_room, lightroom, NotFarIn, Outside
  282.     sdesc = "At End Of Road"
  283.     ldesc = {
  284.         I(); "You are standing at the end of a road before a 
  285.         small brick building. Around you is a forest.  A 
  286.         small stream flows out of the building and down a 
  287.         gully.";
  288.     }
  289.     road = At_Hill_In_Road
  290.     west = At_Hill_In_Road
  291.     up = At_Hill_In_Road
  292.     building = Inside_Building
  293.     in = Inside_Building
  294.     east = Inside_Building
  295.     downstream = In_A_Valley
  296.     gully = In_A_Valley
  297.     stream = In_A_Valley
  298.     south = In_A_Valley
  299.     down = In_A_Valley
  300.     forest = In_Forest_1
  301.     north = In_Forest_1
  302.     depression = Outside_Grate
  303.  
  304.     // This was in the original fortran code, but conflicts
  305.     // with the fact that the building is to the east:
  306.     // east = In_Forest
  307. ;
  308. Building: floatingdecoration
  309.     sdesc = "building"
  310.     ldesc = {
  311.         if (Me.isIn(Inside_Building))
  312.             "You're in it.";
  313.         else
  314.             "It's a small brick building.  It seems to be 
  315.             a well house.";
  316.     }
  317.     noun = 'building' 'house' 'wellhouse'
  318.     adjective = 'well' 'small' 'brick'
  319.     loclist = [ At_End_Of_Road  At_Hill_In_Road  Inside_Building ]
  320.  
  321.     verDoEnter(actor) = {}
  322.     doEnter(actor) = {
  323.         actor.travelTo(At_End_Of_Road.in);
  324.     }
  325. ;
  326. Road: floatingdecoration
  327.     sdesc = "road"
  328.     noun = 'road' 'street' 'path'
  329.     adjective = 'dirt'
  330.     loclist = [ At_End_Of_Road  At_Hill_In_Road  In_Forest_2 ]
  331. ;
  332. Forest: floatingdecoration
  333.     sdesc = "forest"
  334.     adesc = "forest"
  335.     ldesc = {
  336.         "The trees of the forest are large hardwood oak and 
  337.         maple, with an occasional grove of pine or spruce.  
  338.         There is quite a bit of undergrowth, largely birch 
  339.         and ash saplings plus nondescript bushes of various 
  340.         sorts.  This time of year visibility is quite 
  341.         restricted by all the leaves, but travel is quite 
  342.         easy if you detour around the spruce and berry 
  343.         bushes.";
  344.     }
  345.  
  346.     noun = 'forest' 'tree' 'trees' 'oak' 'maple' 'grove' 'pine'
  347.         'spruce' 'birch' 'ash' 'saplings' 'bushes' 'leaves'
  348.         'berry' 'berries'
  349.     adjective = 'surrounding' 'open' 'hardwood' 'oak' 'maple' 'pine'
  350.         'spruce' 'birch' 'ash' 'berry'
  351.     loclist = [
  352.         At_End_Of_Road  At_Hill_In_Road  In_A_Valley
  353.         In_Forest_1  In_Forest_2
  354.     ]
  355. ;
  356. Stream: floatingdecoration
  357.     sdesc = "stream"
  358.     ldesc = {
  359.         if (Me.isIn(Inside_Building))
  360.             "The stream flows out through a pair of 1 
  361.             foot diameter sewer pipes.";
  362.         else
  363.             pass ldesc;
  364.     }
  365.     noun = 'stream' 'water' 'brook' 'river' 'lake'
  366.     adjective = 'small' 'tumbling' 'splashing' 'babbling' 'rushing'
  367.         'reservoir'
  368.     loclist = [
  369.         At_End_Of_Road  In_A_Valley  At_Slit_In_Streambed
  370.         In_Pit  In_Cavern_With_Waterfall  At_Reservoir
  371.         Inside_Building
  372.     ]
  373.  
  374.     verDoDrink(actor) = {}
  375.     doDrink(actor) = {
  376.         "You have taken a drink from the stream.  The water 
  377.         tastes strongly of minerals, but is not unpleasant.  
  378.         It is extremely cold.";
  379.     }
  380.  
  381.     verDoTake(actor) = {
  382.         if (not bottle.isIn(Me))
  383.             "You have nothing in which to carry the water.";
  384.     }
  385.     doTake(actor) = {
  386.         bottle.ioPutIn(actor, self);
  387.     }
  388.     verDoPutIn(actor, io) = {}
  389.     doPutIn(actor, io) = {
  390.         if (io <> bottle)
  391.             "You have nothing in which to carry the water.";
  392.         else
  393.             bottle.ioPutIn(actor, self);
  394.     }
  395. ;
  396. Gully: floatingdecoration
  397.     sdesc = "gully"
  398.     noun = 'gully'
  399.     loclist = [ At_End_Of_Road  At_Slit_In_Streambed  Outside_Grate ]
  400. ;
  401.  
  402. At_Hill_In_Road: CCR_room, lightroom, NotFarIn, Outside
  403.     sdesc = "At Hill In Road"
  404.     ldesc = {
  405.         I(); "You have walked up a hill, still in the forest. 
  406.         The road slopes back down the other side of the 
  407.         hill.  There is a building in the distance.";
  408.     }
  409.     road = At_End_Of_Road
  410.     building = At_End_Of_Road
  411.     forwards = At_End_Of_Road
  412.     east = At_End_Of_Road
  413.     north = At_End_Of_Road
  414.     down = At_End_Of_Road
  415.     forest = In_Forest_1
  416.     south = In_Forest_1
  417.  
  418.     // Another bug in the original code:
  419.     // north = In_Forest
  420. ;
  421. Hill: CCR_decoration
  422.     sdesc = "hill"
  423.     ldesc = "It's just a typical hill."
  424.     noun = 'hill' 'bump' 'incline'
  425.     location = At_Hill_In_Road
  426. ;
  427. OtherSideOfHill: CCR_decoration
  428.     sdesc = "other side of hill"
  429.     thedesc = "the other side of the hill"
  430.     adesc = { self.thedesc; }
  431.     ldesc = "Why not explore it yourself?"
  432.     noun = 'side'
  433.     adjective = 'other'
  434.     location = At_Hill_In_Road
  435. ;
  436.  
  437. Inside_Building: CCR_room, lightroom, NotFarIn, Outside
  438.     sdesc = "Inside Building"
  439.     ldesc = {
  440.         I(); "You are inside a building, a well house for a 
  441.         large spring.";
  442.     }
  443.     out = At_End_Of_Road
  444.     outdoors = At_End_Of_Road
  445.     west = At_End_Of_Road
  446.     xyzzy = In_Debris_Room
  447.     plugh = At_Y2
  448.     downstream = { return self.stream; }
  449.     stream = {
  450.         "The stream flows out through a pair of 1 foot 
  451.         diameter sewer pipes. It would be advisable to use 
  452.         the exit.";
  453.  
  454.         return nil;
  455.     }
  456. ;
  457. Spring: CCR_decoration
  458.     sdesc = "spring"
  459.     location = Inside_Building
  460.     noun = 'spring'
  461.     adjective = 'large'
  462. ;
  463. SewerPipes: CCR_decoration
  464.     sdesc = "pair of 1 foot diameter sewer pipes"
  465.     location = Inside_Building
  466.     noun = 'pipes' 'pipe'
  467.     adjective = 'one' 'foot' '1-foot' 'diameter' 'sewer'
  468. ;
  469.  
  470. In_A_Valley: CCR_room, lightroom, NotFarIn, Outside
  471.     sdesc = "In A Valley"
  472.     ldesc = {
  473.         I(); "You are in a valley in the forest beside a 
  474.         stream tumbling along a rocky bed.";
  475.     }
  476.     upstream = At_End_Of_Road
  477.     building = At_End_Of_Road
  478.     north = At_End_Of_Road
  479.     forest = In_Forest_1
  480.     east = In_Forest_1
  481.     west = In_Forest_1
  482.     up = In_Forest_1
  483.     downstream = At_Slit_In_Streambed
  484.     south = At_Slit_In_Streambed
  485.     down = At_Slit_In_Streambed
  486.     depression = Outside_Grate
  487. ;
  488. Streambed: floatingdecoration
  489.     sdesc = "streambed"
  490.     noun = 'bed' 'streambed' 'rock'
  491.     adjective = 'stream' 'water' 'river' 'small' 'tumbling' 'splashing'
  492.             'babbling' 'rushing' 'rocky' 'bare' 'dry'
  493.     loclist = [ In_A_Valley  At_Slit_In_Streambed  Outside_Grate ]
  494. ;
  495. Valley: floatingdecoration
  496.     sdesc = "valley"
  497.     ldesc = {
  498.         if (Me.isIn(In_A_Valley))
  499.             "You're in it.";
  500.         else
  501.             pass ldesc;
  502.     }
  503.     noun = 'valley'
  504.     adjective = 'deep'
  505.     loclist = [ In_A_Valley  In_Forest_1  In_Forest_2 ]
  506. ;
  507.  
  508. In_Forest_1: CCR_room, lightroom, NotFarIn, Outside
  509.     sdesc = "In Forest"
  510.     ldesc = {
  511.         I(); "You are in open forest, with a deep valley to 
  512.         one side.";
  513.     }
  514.     valley = In_A_Valley
  515.     east = In_A_Valley
  516.     down = In_A_Valley
  517.  
  518.     // An approximation of the original code:
  519.     forest = {
  520.         if (rand(100) <= 50)
  521.             return In_Forest_1;
  522.         else
  523.             return In_Forest_2;
  524.     }
  525.  
  526.     forwards = In_Forest_1
  527.     north = In_Forest_1
  528.     west = In_Forest_1
  529.     south = In_Forest_1
  530. ;
  531.  
  532. In_Forest_2: CCR_room, lightroom, NotFarIn, Outside
  533.     sdesc = "In Forest"
  534.     ldesc = {
  535.         I(); "You are in open forest near both a valley and a 
  536.         road.";
  537.     }
  538.     road = At_End_Of_Road
  539.     north = At_End_Of_Road
  540.     valley = In_A_Valley
  541.     east = In_A_Valley
  542.     west = In_A_Valley
  543.     down = In_A_Valley
  544.     forest = In_Forest_1
  545.     south = In_Forest_1
  546. ;
  547.  
  548. At_Slit_In_Streambed: CCR_room, lightroom, NotFarIn, Outside
  549.     sdesc = "At Slit In Streambed"
  550.     ldesc = {
  551.         I(); "At your feet all the water of the stream 
  552.         splashes into a 2-inch slit in the rock.  Downstream 
  553.         the streambed is bare rock.";
  554.     }
  555.     building = At_End_Of_Road
  556.     upstream = In_A_Valley
  557.     north = In_A_Valley
  558.     forest = In_Forest_1
  559.     east = In_Forest_1
  560.     west = In_Forest_1
  561.     downstream = Outside_Grate
  562.     rock = Outside_Grate
  563.     bed = Outside_Grate
  564.     south = Outside_Grate
  565.  
  566.     slit = { return self.down; }
  567.     stream = { return self.down; }
  568.     down = {
  569.         "You don't fit through a two-inch slit!";
  570.         return nil;
  571.     }
  572. ;
  573. Slit: CCR_decoration
  574.     sdesc = "2-inch slit"
  575.     ldesc = "It's just a 2-inch slit in the rock, through which the
  576.         stream is flowing."
  577.     location = At_Slit_In_Streambed
  578.     noun = 'slit'
  579.     adjective = 'two' 'inch' '2-inch' 'two-inch'
  580. ;
  581.  
  582. Outside_Grate: CCR_room, lightroom, NotFarIn, Outside
  583.     sdesc = "Outside Grate"
  584.     ldesc = {
  585.         I(); "You are in a 20-foot depression floored with 
  586.         bare dirt.  Set into the dirt is a strong steel grate 
  587.         mounted in concrete.  A dry streambed leads into the 
  588.         depression.";
  589.     }
  590.     forest = In_Forest_1
  591.     east = In_Forest_1
  592.     west = In_Forest_1
  593.     south = In_Forest_1
  594.     building = At_End_Of_Road
  595.     upstream = At_Slit_In_Streambed
  596.     gully = At_Slit_In_Streambed
  597.     north = At_Slit_In_Streambed
  598.     
  599.     in = { return self.down; }
  600.     down = {
  601.         Grate.doEnter(Me);
  602.         return nil;
  603.     }
  604. ;
  605. Depression: CCR_decoration
  606.     sdesc = "20-foot depression"
  607.     ldesc = "You're standing in it."
  608.     location = Outside_Grate
  609.     noun = 'depression' 'dirt'
  610.     adjective = '20-foot' 'twenty' 'foot' 'twenty-foot' 'bare'
  611. ;
  612. Grate: fixeditem, keyedLockable
  613.     isopen = nil
  614.     islocked = true
  615.     sdesc = "steel grate"
  616.     ldesc = {
  617.         if (self.isIn(Outside_Grate)) {
  618.             "It just looks like an ordinary grate
  619.             mounted in concrete.";
  620.         }
  621.         else {
  622.             "It's just a 3x3 steel grate mounted
  623.             in the ceiling.";
  624.         }
  625.  
  626.         " It is ";
  627.         if (self.isopen)
  628.             "open.";
  629.         else if (self.islocked) 
  630.             "closed and locked.";
  631.         else 
  632.             "closed.";
  633.     }
  634.     noun = 'grate' 'lock' 'gate' 'grille'
  635.     adjective = 'metal' 'strong' 'steel' 'open' 'closed' 'locked'
  636.         'unlocked'
  637.  
  638.     locationOK = true // Tell compiler OK for location to be method
  639.     location = {
  640.         if (Me.isIn(Outside_Grate))
  641.             return Outside_Grate;
  642.         else        
  643.             return Below_The_Grate;
  644.     }
  645.     mykey = set_of_keys
  646.  
  647.     verDoEnter(actor) = {}
  648.     doEnter(actor) = {
  649.         if (not Grate.islocked) {
  650.             if (not Grate.isopen) {
  651.                 "(Opening the grate first.)\b";
  652.                 Grate.isopen := true;
  653.                         
  654.             }
  655.             if (actor.isIn(Outside_Grate))
  656.                 actor.travelTo(Below_The_Grate);
  657.             else
  658.                 actor.travelTo(Outside_Grate);
  659.         }
  660.         else {
  661.             "You can't go through a locked steel grate!";
  662.         }
  663.     }
  664.     
  665.     verIoPutIn(actor) = { "You can't put anything in that! "; }
  666.     verDoPick = { "You have no tools to pick the lock with."; }
  667. ;
  668.  
  669. Below_The_Grate: CCR_room, lightroom, NotFarIn
  670.     sdesc = "Below the Grate"
  671.     ldesc = {
  672.         I(); "You are in a small chamber beneath a 3x3 steel 
  673.         grate to the surface. A low crawl over cobbles leads 
  674.         inward to the west.";
  675.     }
  676.     crawl = In_Cobble_Crawl
  677.     cobble = In_Cobble_Crawl
  678.     in = In_Cobble_Crawl
  679.     west = In_Cobble_Crawl
  680.     pit = At_Top_Of_Small_Pit
  681.     debris = In_Debris_Room
  682.  
  683.     outdoors = { return self.up; }    // DMB: added
  684.     out = { return self.up; }
  685.     up = {
  686.         Grate.doEnter(Me);
  687.         return nil;
  688.     }
  689. ;
  690. Cobbles: floatingdecoration
  691.     sdesc = "cobbles"
  692.     adesc = "cobbles"
  693.     ldesc = "They're just ordinary cobbles."
  694.     noun = 'cobble' 'cobbles' 'cobblestones' 'cobblestone' 'stones'
  695.         'stone'
  696.     adjective = 'cobble'
  697.     loclist = [ Below_The_Grate  In_Cobble_Crawl  In_Debris_Room ]
  698. ;
  699.  
  700. In_Cobble_Crawl: CCR_room, lightroom, NotFarIn
  701.     sdesc = "In Cobble Crawl"
  702.     ldesc = {
  703.         I(); "You are crawling over cobbles in a low passage. 
  704.         There is a dim light at the east end of the 
  705.         passage.";
  706.     }
  707.     out = Below_The_Grate
  708.     tosurface = Below_The_Grate
  709.     east = Below_The_Grate
  710.     in = In_Debris_Room
  711.     dark = In_Debris_Room
  712.     west = In_Debris_Room
  713.     debris = In_Debris_Room
  714.     pit = At_Top_Of_Small_Pit
  715.  
  716.     // DMB: added the following, in accordance with its presence
  717.     // in In_Debris_Room and rooms beyond.
  718.     depression = {
  719.         Grate.doEnter(Me);
  720.  
  721.         // If the player didn't move, the grate must be
  722.         // locked.  Move the player underneath the grate.
  723.         if (Me.isIn(self)) {
  724.             "\b";
  725.             Me.travelTo(Below_The_Grate);
  726.         }
  727.         // We've already moved the player, but we have to
  728.         // return a value, so just return nil (which results
  729.         // in no more movement).
  730.         return nil;
  731.     }
  732. ;
  733.  
  734. In_Debris_Room: CCR_room, NotFarIn
  735.     sdesc = "In Debris Room"
  736.     ldesc = {
  737.         I(); "You are in a debris room filled with stuff 
  738.         washed in from the surface. A low wide passage with 
  739.         cobbles becomes plugged with mud and debris here, but 
  740.         an awkward canyon leads upward and west."; P();
  741.  
  742.         I(); "A note on the wall says, \"Magic word XYZZY.\"";
  743.     }
  744.     entrance = Below_The_Grate
  745.     crawl = In_Cobble_Crawl
  746.     cobble = In_Cobble_Crawl
  747.     passage = In_Cobble_Crawl
  748.     low = In_Cobble_Crawl
  749.     east = In_Cobble_Crawl
  750.     canyon = In_Awkward_Sloping_E_W_Canyon
  751.     in = In_Awkward_Sloping_E_W_Canyon
  752.     up = In_Awkward_Sloping_E_W_Canyon
  753.     west = In_Awkward_Sloping_E_W_Canyon
  754.     xyzzy = Inside_Building
  755.     pit = At_Top_Of_Small_Pit
  756.  
  757.     // The original occasionally allowed the player to teleport
  758.     // large distances in one turn.  This is just one example.
  759.     depression = {
  760.         Grate.doEnter(Me);
  761.  
  762.         // If the player didn't move, the grate must be
  763.         // locked.  Move the player underneath the grate.
  764.         if (Me.isIn(self)) {
  765.             "\b";
  766.             Me.travelTo(Below_The_Grate);
  767.         }
  768.  
  769.         // We've already moved the player, but we have to
  770.         // return a value, so just return nil (which results
  771.         // in no more movement).
  772.         return nil;
  773.     }
  774. ;
  775. Debris: floatingdecoration
  776.     sdesc = "debris"
  777.     ldesc = "Yuck."
  778.     noun = 'debris' 'stuff' 'mud'
  779.     loclist = [ In_Debris_Room  In_Arched_Hall ]
  780. ;
  781. XyzzyNote: CCR_decoration, readable
  782.     sdesc = "note"
  783.     ldesc = { self.readdesc; }
  784.     readdesc = "The note says \"Magic word XYZZY\"."
  785.     noun = 'note'
  786.     location = In_Debris_Room
  787. ;
  788.  
  789. In_Awkward_Sloping_E_W_Canyon: CCR_room, NotFarIn
  790.     sdesc = "In Awkward Sloping E/W Canyon"
  791.     ldesc = {
  792.         I(); "You are in an awkward sloping east/west 
  793.         canyon.";
  794.     }
  795.  
  796.     entrance = Below_The_Grate
  797.     down = In_Debris_Room
  798.     east = In_Debris_Room
  799.     debris = In_Debris_Room
  800.     in = In_Bird_Chamber
  801.     up = In_Bird_Chamber
  802.     west = In_Bird_Chamber
  803.     pit = At_Top_Of_Small_Pit
  804.  
  805.     depression = {
  806.         Grate.doEnter(Me);
  807.  
  808.         // If the player didn't move, the grate must be
  809.         // locked.  Move the player underneath the grate.
  810.         if (Me.isIn(self)) {
  811.             "\b";
  812.             Me.travelTo(Below_The_Grate);
  813.         }
  814.         
  815.         // We've already moved the player, but we have to
  816.         // return a value, so just return nil (which results
  817.         // in no more movement).
  818.         return nil;
  819.     }
  820. ;
  821.  
  822. In_Bird_Chamber: CCR_room, NotFarIn
  823.     sdesc = "In Bird Chamber"
  824.     ldesc = {
  825.         I(); "You are in a splendid chamber thirty feet high. 
  826.         The walls are frozen rivers of orange stone.  An 
  827.         awkward canyon and a good passage exit from east and 
  828.         west sides of the chamber.";
  829.     }
  830.  
  831.     entrance = Below_The_Grate
  832.     debris = In_Debris_Room
  833.     canyon = In_Awkward_Sloping_E_W_Canyon
  834.     east = In_Awkward_Sloping_E_W_Canyon
  835.     passage = At_Top_Of_Small_Pit
  836.     pit = At_Top_Of_Small_Pit
  837.     west = At_Top_Of_Small_Pit
  838.  
  839.     depression = {
  840.         Grate.doEnter(Me);
  841.  
  842.         // If the player didn't move, the grate must be
  843.         // locked.  Move the player underneath the grate.
  844.         if (Me.isIn(self)) {
  845.             "\b";
  846.             Me.travelTo(Below_The_Grate);
  847.         }
  848.  
  849.         // We've already moved the player, but we have to
  850.         // return a value, so just return nil (which results
  851.         // in no more movement).
  852.         return nil;
  853.     }
  854. ;
  855.  
  856. At_Top_Of_Small_Pit: CCR_room, NotFarIn
  857.     sdesc = "At Top of Small Pit"
  858.     ldesc = {
  859.         // Note: this used to say "An east passage ends here..."
  860.         // but that's obviously a mistake.
  861.  
  862.         I(); "At your feet is a small pit breathing traces of 
  863.         white mist.  A west passage ends here except for a 
  864.         small crack leading on."; P();
  865.  
  866.         I(); "Rough stone steps lead down the pit.";
  867.     }
  868.     entrance = Below_The_Grate
  869.     debris = In_Debris_Room
  870.     passage = In_Bird_Chamber
  871.     east = In_Bird_Chamber
  872.     crack = { return self.west; }
  873.     west = {
  874.         "The crack is far too small for you to follow.";
  875.         return nil;
  876.     }
  877.  
  878.     down = {
  879.         if (large_gold_nugget.isIn(Me))
  880.             return broken_neck.death;
  881.         else
  882.             return In_Hall_Of_Mists;
  883.     }
  884.  
  885.     depression = {
  886.         Grate.doEnter(Me);
  887.  
  888.         // If the player didn't move, the grate must be
  889.         // locked.  Move the player underneath the grate.
  890.         if (Me.isIn(self)) {
  891.             "\b";
  892.             Me.travelTo(Below_The_Grate);
  893.         }
  894.         
  895.         // We've already moved the player, but we have to
  896.         // return a value, so just return nil (which results
  897.         // in no more movement).
  898.         return nil;
  899.     }
  900. SmallPit: CCR_decoration
  901.     sdesc = "small pit"
  902.     ldesc = "The pit is breathing traces of white mist."
  903.     location = At_Top_Of_Small_Pit
  904.     noun = 'pit'
  905. ;
  906. PitCrack: CCR_decoration
  907.     sdesc = "crack"
  908.     ldesc = "The crack is very small -- far too small for you to follow."
  909.     location = At_Top_Of_Small_Pit
  910.     noun = 'crack'
  911.     adjective = 'small'
  912. ;
  913. Mist: floatingdecoration
  914.     sdesc = "mist"
  915.     ldesc = {
  916.         "Mist is a white vapor, usually water, seen from time 
  917.         to time in caverns.  It can be found anywhere but is 
  918.         frequently a sign of a deep pit leading down to 
  919.         water.";
  920.     }
  921.     noun = 'mist' 'vapor' 'wisps'
  922.     adjective = 'white' 'water'
  923.     loclist = [
  924.         At_Top_Of_Small_Pit In_Hall_Of_Mists
  925.         On_East_Bank_Of_Fissure  At_Window_On_Pit_1
  926.         At_West_End_Of_Hall_Of_Mists In_Misty_Cavern
  927.         In_Mirror_Canyon  At_Reservoir At_Window_On_Pit_2
  928.         On_Sw_Side_Of_Chasm
  929.     ]
  930. ;
  931.  
  932. In_Hall_Of_Mists: CCR_room
  933.     sdesc = "In Hall of Mists"
  934.     ldesc = {
  935.         I(); "You are at one end of a vast hall stretching 
  936.         forward out of sight to the west.  There are openings 
  937.         to either side.  Nearby, a wide stone staircase leads 
  938.         downward.  The hall is filled with wisps of white 
  939.         mist swaying to and fro almost as if alive.  A cold 
  940.         wind blows up the staircase.  There is a passage at 
  941.         the top of a dome behind you."; P();
  942.  
  943.         I(); "Rough stone steps lead up the dome.";
  944.     }
  945.     left = In_Nugget_Of_Gold_Room
  946.     south = In_Nugget_Of_Gold_Room
  947.     forwards = On_East_Bank_Of_Fissure
  948.     hall = On_East_Bank_Of_Fissure
  949.     west = On_East_Bank_Of_Fissure
  950.     stairs = In_Hall_Of_Mt_King
  951.     down = In_Hall_Of_Mt_King
  952.     north = In_Hall_Of_Mt_King
  953.     y2 = Jumble_Of_Rock
  954.  
  955.     up = {
  956.         if (large_gold_nugget.isIn(Me)) {
  957.             "The dome is unclimbable.";
  958.             return nil;
  959.         }
  960.         else {
  961.             return At_Top_Of_Small_Pit;
  962.         }
  963.     }
  964. ;
  965. Staircase: CCR_decoration
  966.     sdesc = "wide stone staircase"
  967.     ldesc = "The staircase leads down."
  968.     location = In_Hall_Of_Mists
  969.     noun = 'stair' 'stairs' 'staircase'
  970.     adjective = 'wide' 'stone'
  971. ;
  972. DomeSteps: CCR_decoration
  973.     sdesc = "rough stone steps"
  974.     ldesc = "The rough stone steps lead up the dome."
  975.     location = In_Hall_Of_Mists
  976.     noun = 'stair' 'stairs' 'staircase'
  977.     adjective = 'rough' 'stone'
  978. ;
  979. Dome: CCR_decoration
  980.     sdesc = "dome"
  981.     ldesc = {
  982.         if (large_gold_nugget.isIn(Me))
  983.             "I'm not sure you'll be able to get up it
  984.             with what you're carrying.";
  985.         else
  986.             "It looks like you might be able to climb up it.";
  987.     }
  988.     location = In_Hall_Of_Mists
  989.     noun = 'dome'
  990.  
  991.     verDoClimb(actor) = {}
  992.     doClimb(actor) = {
  993.         actor.travelTo(In_Hall_Of_Mists.up);
  994.     }
  995. ;
  996.  
  997. On_East_Bank_Of_Fissure: CCR_room
  998.     sdesc = "On East Bank of Fissure"
  999.     ldesc = {
  1000.         I(); "You are on the east bank of a fissure slicing 
  1001.         clear across the hall. The mist is quite thick here, 
  1002.         and the fissure is too wide to jump.";
  1003.  
  1004.          if (CrystalBridge.exists) {
  1005.             P(); I();
  1006.             "A crystal bridge now spans the fissure.";
  1007.         }
  1008.     }
  1009.     hall = In_Hall_Of_Mists
  1010.     east = In_Hall_Of_Mists
  1011.  
  1012.     forwards = { return self.jump; }
  1013.     jump = {
  1014.         if (CrystalBridge.exists) {
  1015.             "I respectfully suggest you go across the 
  1016.             bridge instead of jumping.";
  1017.  
  1018.             return nil;
  1019.         }
  1020.         else
  1021.             return didnt_make_it.death;
  1022.     }
  1023.  
  1024.     over = { return self.across; }
  1025.     west = { return self.across; }
  1026.     cross = { return self.across; }
  1027.     across = {
  1028.         CrystalBridge.doCross(Me);
  1029.         return nil;
  1030.     }
  1031.  
  1032.     //
  1033.     // NPC's can go across too, but only if the bridge exists.
  1034.     //
  1035.     NPCexit1 = {
  1036.         if (CrystalBridge.exists)
  1037.             return West_Side_Of_Fissure;
  1038.         else
  1039.             return nil;
  1040.     }
  1041. ;
  1042. BridgeFissure: floatingdecoration
  1043.     sdesc = "fissure"
  1044.     ldesc = {
  1045.         if (CrystalBridge.exists)
  1046.             "A crystal bridge now spans the fissure.";
  1047.         else
  1048.             "The fissure looks far too wide to jump.";
  1049.     }
  1050.     noun = 'fissure'
  1051.     adjective = 'wide'
  1052.     loclist = [ West_Side_Of_Fissure  On_East_Bank_Of_Fissure ]
  1053. ;
  1054. CrystalBridge: CCR_decoration
  1055.     exists = nil
  1056.     sdesc = "Crystal bridge"
  1057.     ldesc = "It spans the fissure, thereby providing you a way across."
  1058.     locationOK = true    // tell compiler OK for location to be method
  1059.     location = {
  1060.         if (self.exists) {
  1061.             if (Me.isIn(West_Side_Of_Fissure))
  1062.                 return West_Side_Of_Fissure;
  1063.             else
  1064.                 return On_East_Bank_Of_Fissure;
  1065.         }
  1066.         else
  1067.             return nil;
  1068.     }
  1069.     noun = 'bridge'
  1070.     adjective = 'crystal' 'magic' 'rod'
  1071.  
  1072.     verDoCross(actor) = {}
  1073.     doCross(actor) = {
  1074.         if (self.exists) {
  1075.             if (actor.isIn(On_East_Bank_Of_Fissure))
  1076.                 actor.travelTo(West_Side_Of_Fissure);
  1077.             else
  1078.                 actor.travelTo(On_East_Bank_Of_Fissure);
  1079.         }
  1080.         else
  1081.             "There is no way across the fissure.";
  1082.     }
  1083. ;
  1084.  
  1085. In_Nugget_Of_Gold_Room: CCR_room
  1086.     sdesc = "In Nugget of Gold Room"
  1087.     ldesc = {
  1088.         I(); "This is a low room with a crude note on the 
  1089.         wall. "; NuggetNote.readdesc;
  1090.     }
  1091.     hall = In_Hall_Of_Mists
  1092.     out = In_Hall_Of_Mists
  1093.     north = In_Hall_Of_Mists
  1094. ;
  1095. NuggetNote: CCR_decoration, readable
  1096.     sdesc = "note"
  1097.     ldesc = { self.readdesc; }
  1098.     readdesc = {
  1099.         "The note says, \"You won't get it up the steps\".";
  1100.     }
  1101.     location = In_Nugget_Of_Gold_Room
  1102.     noun = 'note'
  1103.     adjective = 'crude'
  1104. ;
  1105.  
  1106. In_Hall_Of_Mt_King: CCR_room
  1107.     sdesc = "In Hall of Mt King"
  1108.     ldesc = {
  1109.         I(); "You are in the hall of the mountain king, with 
  1110.         passages off in all directions.";
  1111.  
  1112.         if (Snake.isIn(self)) {
  1113.             P();
  1114.             I(); "A huge green fierce snake bars the way!";
  1115.         }
  1116.     }
  1117.     stairs = In_Hall_Of_Mists
  1118.     up = In_Hall_Of_Mists
  1119.     east = In_Hall_Of_Mists
  1120.  
  1121.     left = { return self.north; }
  1122.     north = {
  1123.         if (self.snakecheck)
  1124.             return Low_N_S_Passage;
  1125.         else
  1126.             return nil;
  1127.     }
  1128.     
  1129.     right = { return self.south; }
  1130.     south = {
  1131.         if (self.snakecheck)
  1132.             return In_South_Side_Chamber;
  1133.         else
  1134.             return nil;
  1135.     }
  1136.  
  1137.     forwards = { return self.west; }
  1138.     west = {
  1139.         if (self.snakecheck)
  1140.             return In_West_Side_Chamber;
  1141.         else
  1142.             return nil;
  1143.     }
  1144.  
  1145.     /*
  1146.      * An interesting little bit of trivia here:
  1147.      * 35% of the time you can slip past the snake and into
  1148.      * the secret canyon.  (This is in the original fortran
  1149.      * code.)  But if you say "secret" you will *always* sneak
  1150.      * by it.
  1151.      */
  1152.     sw = {
  1153.         if (rand(100) <= 35) {
  1154.             return In_Secret_E_W_Canyon;
  1155.         }
  1156.         else {
  1157.             if (self.snakecheck)
  1158.                 return In_Secret_E_W_Canyon;
  1159.             else
  1160.                 return nil;
  1161.         }
  1162.     }
  1163.     secret = In_Secret_E_W_Canyon
  1164.  
  1165.     snakecheck = {
  1166.         if (Snake.isIn(Me.location)) {
  1167.             "You can't get by the snake.";
  1168.             return nil;
  1169.         }
  1170.         else
  1171.             return true;
  1172.     }
  1173. ;
  1174. Snake: CCR_decoration
  1175.     sdesc = "snake"
  1176.     ldesc = "I wouldn't mess with it if I were you."
  1177.     location = In_Hall_Of_Mt_King
  1178.     noun = 'snake' 'cobra' 'asp'
  1179.     adjective = 'huge' 'fierce' 'green' 'ferocious' 'venemous'
  1180.         'venomous' 'large' 'big' 'killer'
  1181.  
  1182.     verDoFeed(actor) = {}
  1183.     doFeed(actor) = {
  1184.         if (little_bird.isIn(Me)) {
  1185.             "The snake has now devoured your bird.";
  1186.             little_bird.moveInto(nil);
  1187.         }
  1188.         else if (little_bird.isIn(self.location))
  1189.             "You have nothing to feed it.";
  1190.         else
  1191.             "There's nothing here it wants to eat (except 
  1192.             perhaps you).";
  1193.     }
  1194.     verIoGiveTo(actor) = {}
  1195.     doGiveTo(actor, dobj) = {
  1196.         if (dobj = little_bird)
  1197.             self.doFeed(actor);
  1198.         else {
  1199.             "The snake does not seem interested in ";
  1200.             dobj.thedesc; ".";
  1201.         }
  1202.     }
  1203.     
  1204.     verDoAttack(actor) = {}
  1205.     doAttack(actor) = {
  1206.         "Attacking the snake both doesn't work and is very 
  1207.         dangerous.";
  1208.     }
  1209.     verDoAttackWith(actor, io) = { self.verDoAttack(actor); }
  1210.     doAttackWith(actor, io) = { self.doAttack(actor); }
  1211.  
  1212.     verIoThrowAt(actor) = { self.verIoGiveTo(actor); }
  1213.     ioThrowAt(actor, dobj) = {
  1214.         if (dobj = axe)
  1215.             self.doAttackWith(actor, dobj);
  1216.         else
  1217.             self.ioGiveTo(actor, dobj);
  1218.     }
  1219.     verIoThrowTo(actor) = { self.verIoGiveTo(actor); }
  1220.     ioThrowTo(actor, dobj) = {
  1221.         if (dobj = axe)
  1222.             self.doAttackWith(actor, dobj);
  1223.         else
  1224.             self.ioGiveTo(actor, dobj);
  1225.     }
  1226.     
  1227.     verDoKick(actor) = {}
  1228.     doKick(actor) = { "That would be satisfying, but totally insane."; }
  1229.  
  1230.     verifyRemove(actor) = { "Surely you're joking."; }
  1231. ;
  1232.  
  1233. At_West_End_Of_Twopit_Room: CCR_room
  1234.     sdesc = "At West End of Twopit Room"
  1235.     ldesc = {
  1236.         I(); "You are at the west end of the twopit room.  
  1237.          There is a large hole in the wall above the pit at 
  1238.         this end of the room.";
  1239.  
  1240.         if (PlantStickingUp.isIn(self)) {
  1241.             P(); I(); PlantStickingUp.ldesc;
  1242.         }
  1243.     }
  1244.     east = At_East_End_Of_Twopit_Room
  1245.     across = At_East_End_Of_Twopit_Room
  1246.     west = In_Slab_Room
  1247.     slab = In_Slab_Room
  1248.     down = In_West_Pit
  1249.     pit = In_West_Pit
  1250.  
  1251.     up = { return self.hole; }    // DMB: added
  1252.     hole = {
  1253.         "It is too far up for you to reach.";
  1254.         return nil;
  1255.     }
  1256. ;
  1257. HoleAbovePit_1: CCR_decoration
  1258.     sdesc = "hole above pit"
  1259.     ldesc = {
  1260.         "The hole is in the wall above the pit at 
  1261.         this end of the room.";
  1262.     }
  1263.     noun = 'hole'
  1264.     adjective = 'large'
  1265.     location = At_West_End_Of_Twopit_Room
  1266.  
  1267.     verDoEnter(actor) = { "It is too far up for you to reach."; }
  1268. ;
  1269. PlantStickingUp: CCR_decoration
  1270.     sdesc = {
  1271.         if (Plant.size = 1)
  1272.             "top of 12-foot-tall beanstalk";
  1273.         else
  1274.             "huge beanstalk";
  1275.     }
  1276.     ldesc = {
  1277.         if (Plant.size = 1)
  1278.             "The top of a 12-foot-tall beanstalk is 
  1279.             poking out of the west pit.";
  1280.         else
  1281.             "There is a huge beanstalk growing out of the 
  1282.             west pit up to the hole.";
  1283.     }
  1284.     noun = 'plant' 'beanstalk' 'stalk'
  1285.     adjective = 'bean' 'giant' 'tiny' 'little' 'murmuring'
  1286.         '12-foot-tall' 'twelve' 'foot' 'tall' 'bellowing'
  1287.  
  1288.     location = {
  1289.         if (Plant.size = 0)
  1290.             return nil;
  1291.         else if (Me.isIn(At_West_End_Of_Twopit_Room))
  1292.             return At_West_End_Of_Twopit_Room;
  1293.         else
  1294.             return At_East_End_Of_Twopit_Room;        
  1295.     }
  1296. ;
  1297.  
  1298. In_East_Pit: CCR_room, NoNPC
  1299.     sdesc = "In East Pit"
  1300.     ldesc = {
  1301.         I(); "You are at the bottom of the eastern pit in the 
  1302.         twopit room.  There is a small pool of oil in one 
  1303.         corner of the pit.";
  1304.     }
  1305.     up = At_East_End_Of_Twopit_Room
  1306.     out = At_East_End_Of_Twopit_Room
  1307. ;
  1308. EastPit: CCR_decoration
  1309.     sdesc = "eastern pit"
  1310.     ldesc = "You're in it."
  1311.     noun = 'pit' 'corner'
  1312.     adjective = 'east' 'eastern'
  1313.     location = In_East_Pit
  1314. ;
  1315. Oil: CCR_decoration
  1316.     sdesc = "pool of oil"
  1317.     noun = 'pool' 'oil'
  1318.     adjective = 'small'
  1319.     location = In_East_Pit
  1320.  
  1321.     verDoTake(actor) = {
  1322.         if (not bottle.isIn(Me))
  1323.             "You have nothing in which to carry the oil.";
  1324.     }
  1325.     doTake(actor) = {
  1326.         bottle.ioPutIn(actor, self);
  1327.     }
  1328.     verDoPutIn(actor, io) = {}
  1329.     doPutIn(actor, io) = {
  1330.         if (io <> bottle)
  1331.             "You have nothing in which to carry the oil.";
  1332.         else
  1333.             bottle.ioPutIn(actor, self);
  1334.     }
  1335. ;
  1336.  
  1337. In_West_Pit: CCR_room, NoNPC
  1338.     sdesc = "In West Pit"
  1339.     ldesc = {
  1340.         I(); "You are at the bottom of the western pit in the 
  1341.         twopit room.  There is a large hole in the wall about 
  1342.         25 feet above you."; P();
  1343.  
  1344.         I(); Plant.ldesc;
  1345.     }
  1346.     up = At_West_End_Of_Twopit_Room
  1347.     out = At_West_End_Of_Twopit_Room
  1348.     climb = {
  1349.         if (Plant.size < 1 or Plant.size > 2) {
  1350.             "There is nothing here to climb.  Use \"up\" 
  1351.             or \"out\" to leave the pit.";
  1352.  
  1353.             return nil;
  1354.         }
  1355.         else {
  1356.             Plant.doClimb(Me);
  1357.             return nil;
  1358.         }
  1359.     }
  1360. ;
  1361. Plant: CCR_decoration
  1362.     size = 0
  1363.  
  1364.     sdesc = {
  1365.         if (self.size = 0)
  1366.             "plant";
  1367.         else if (self.size = 1)
  1368.             "beanstalk";
  1369.         else if (self.size = 2)
  1370.             "giant beanstalk";
  1371.     }
  1372.     ldesc = {
  1373.         if (self.size = 0)
  1374.             "There is a tiny little plant in the pit, 
  1375.             murmuring \"Water, water, ...\"";
  1376.         else if (self.size = 1)
  1377.             "There is a 12-foot-tall beanstalk stretching 
  1378.             up out of the pit, bellowing \"Water!! 
  1379.             Water!!\"";
  1380.         else if (self.size = 2)
  1381.             "There is a gigantic beanstalk stretching all 
  1382.             the way up to the hole.";
  1383.     }
  1384.     location = In_West_Pit
  1385.     noun = 'plant' 'beanstalk' 'stalk'
  1386.     adjective = 'bean' 'giant' 'tiny' 'little' 'murmuring'
  1387.         '12-foot-tall' 'twelve' 'foot' 'tall' 'bellowing'
  1388.  
  1389.     verDoClimb(actor) = {
  1390.         if (self.size = 0)
  1391.             "It's just a little plant!";
  1392.     }
  1393.     doClimb(actor) = {
  1394.         if (self.size = 1) {
  1395.             "You have climbed up the plant and out of the 
  1396.             pit.\b";
  1397.  
  1398.             Me.travelTo(At_West_End_Of_Twopit_Room);
  1399.         }
  1400.         else {
  1401.             "You clamber up the plant and scurry through 
  1402.             the hole at the top.\b";
  1403.  
  1404.             Me.travelTo(In_Narrow_Corridor);
  1405.         }
  1406.     }
  1407.  
  1408.     verDoWater(actor) = {}
  1409.     doWater(actor) = {
  1410.         if (bottle.isIn(Me))
  1411.             bottle.doPourOn(actor, self);
  1412.         else
  1413.             "You have nothing to water the plant with.";
  1414.     }
  1415.     verDoOil(actor) = {}
  1416.     doOil(actor) = { self.doWater(actor); }
  1417.  
  1418.     // The plant's not going anywhere.
  1419.     verifyRemove(actor) = {
  1420.         "The plant has exceptionally deep roots and cannot be 
  1421.         pulled free.";
  1422.     }
  1423.  
  1424.     water = {
  1425.         self.size := self.size + 1;
  1426.  
  1427.         if (self.size = 1)
  1428.             "The plant spurts into furious growth for a 
  1429.             few seconds.";
  1430.         else if (self.size = 2)
  1431.             "The plant grows explosively, almost filling 
  1432.             the bottom of the pit.";
  1433.         else {
  1434.             "You've over-watered the plant!  It's 
  1435.             shriveling up!  It's, it's...";
  1436.  
  1437.             self.size := 0;
  1438.         }
  1439.  
  1440.         P(); I(); Plant.ldesc;
  1441.     }
  1442. ;
  1443. WestPit: CCR_decoration
  1444.     sdesc = "western pit"
  1445.     ldesc = "You're in it."
  1446.     noun = 'pit' 'corner'
  1447.     adjective = 'west' 'western'
  1448.     location = In_West_Pit
  1449. ;
  1450. HoleAbovePit_2: CCR_decoration
  1451.     sdesc = "hole above pit"
  1452.     ldesc = "The hole is in the wall above you."
  1453.     noun = 'hole'
  1454.     adjective = 'large'
  1455.     location = At_West_End_Of_Twopit_Room
  1456.  
  1457.     verDoEnter(actor) = {
  1458.         "You're not anywhere near the pit -- it's far overhead.";
  1459.     }
  1460. ;
  1461.  
  1462. West_Side_Of_Fissure: CCR_room
  1463.     sdesc = "West Side of Fissure"
  1464.     ldesc = {
  1465.         I(); "You are on the west side of the fissure in the 
  1466.         hall of mists.";
  1467.  
  1468.         if (CrystalBridge.exists) {
  1469.             P(); I();
  1470.             "A crystal bridge now spans the fissure.";
  1471.         }
  1472.     }
  1473.  
  1474.     west = At_West_End_Of_Hall_Of_Mists
  1475.  
  1476.     forwards = { return self.jump; }
  1477.     jump = {
  1478.         if (CrystalBridge.exists) {
  1479.             "I respectfully suggest you go across the 
  1480.             bridge instead of jumping.";
  1481.  
  1482.             return nil;
  1483.         }
  1484.         else
  1485.             return didnt_make_it.death;
  1486.     }
  1487.  
  1488.     over = { return self.across; }
  1489.     east = { return self.across; }
  1490.     cross = { return self.across; }
  1491.     across = {
  1492.         CrystalBridge.doCross(Me);
  1493.         return nil;
  1494.     }
  1495.  
  1496.     north = {
  1497.         "You have crawled through a very low wide passage 
  1498.         parallel to and north of the hall of mists.\b";
  1499.  
  1500.         return At_West_End_Of_Hall_Of_Mists;
  1501.     }
  1502.  
  1503.     //
  1504.     // NPC's can go across too, but only if the bridge exists.
  1505.     //
  1506.     NPCexit1 = {
  1507.         if (CrystalBridge.exists)
  1508.             return On_East_Bank_Of_Fissure;
  1509.         else
  1510.             return nil;
  1511.     }
  1512. ;
  1513.  
  1514. Low_N_S_Passage: CCR_room
  1515.     sdesc = "Low N/S Passage"
  1516.     ldesc = {
  1517.         I(); "You are in a low N/S passage at a hole in the 
  1518.         floor.  The hole goes down to an E/W passage.";
  1519.     }
  1520.     hall = In_Hall_Of_Mt_King
  1521.     out = In_Hall_Of_Mt_King
  1522.     south = In_Hall_Of_Mt_King
  1523.     north = At_Y2
  1524.     y2 = At_Y2
  1525.     down = In_Dirty_Passage
  1526.     hole = In_Dirty_Passage
  1527. ;
  1528.  
  1529. In_South_Side_Chamber: CCR_room
  1530.     sdesc = "In South Side Chamber"
  1531.     ldesc = {
  1532.         I(); "You are in the south side chamber.";
  1533.     }
  1534.     hall = In_Hall_Of_Mt_King
  1535.     out = In_Hall_Of_Mt_King
  1536.     north = In_Hall_Of_Mt_King
  1537. ;
  1538.  
  1539. In_West_Side_Chamber: CCR_room
  1540.     sdesc = "In West Side Chamber"
  1541.     ldesc = {
  1542.         I(); "You are in the west side chamber of the hall of 
  1543.         the mountain king. A passage continues west and up 
  1544.         here.";
  1545.     }
  1546.     hall = In_Hall_Of_Mt_King
  1547.     out = In_Hall_Of_Mt_King
  1548.     east = In_Hall_Of_Mt_King
  1549.     west = Crossover
  1550.     up = Crossover
  1551. ;
  1552.  
  1553. At_Y2: CCR_room
  1554.     sdesc = "At \"Y2\""
  1555.     ldesc = {
  1556.         I(); "You are in a large room, with a passage to the 
  1557.         south, a passage to the west, and a wall of broken 
  1558.         rock to the east. There is a large \"Y2\" on ";
  1559.  
  1560.         if (Me.isIn(Y2Rock))
  1561.             "the rock you are sitting on.";
  1562.         else
  1563.             "a rock in the room's center.";
  1564.  
  1565.         self.hollowvoice;
  1566.     }
  1567.     plugh = Inside_Building
  1568.     south = Low_N_S_Passage
  1569.     east = Jumble_Of_Rock
  1570.     wall = Jumble_Of_Rock
  1571.     broken = Jumble_Of_Rock
  1572.     west = At_Window_On_Pit_1
  1573.      plover = {
  1574.         if (egg_sized_emerald.isIn(Me))
  1575.             egg_sized_emerald.moveInto(In_Plover_Room);
  1576.             
  1577.         return In_Plover_Room;
  1578.     }
  1579.  
  1580.     hollowvoice = {
  1581.         if (rand(100) <= 25) {
  1582.             P(); I(); "A hollow voice says, \"Plugh.\"";
  1583.         }
  1584.     }
  1585. ;
  1586. Y2Rock: CCR_decoration, chairitem, readable
  1587.     sdesc = "\"Y2\" rock"
  1588.     ldesc = { self.readdesc; }
  1589.     readdesc = "There is a large \"Y2\" painted on the rock."
  1590.     noun = 'rock'
  1591.     adjective = 'y2'
  1592.  
  1593.     location = At_Y2
  1594.  
  1595.     plugh = { return self.location.plugh; }
  1596.  
  1597.     onroom = true    // We set ON the rock, not IN it.
  1598.  
  1599.     //
  1600.     // We want the player to be able to pick things in the
  1601.     // room up while sitting on the rock.
  1602.     //
  1603.     reachable = {
  1604.         return [Y2Rock] + At_Y2.contents;
  1605.     }
  1606. ;
  1607.  
  1608. Jumble_Of_Rock: CCR_room
  1609.     sdesc = "Jumble of Rock"
  1610.     ldesc = {
  1611.         I(); "You are in a jumble of rock, with cracks 
  1612.         everywhere.";
  1613.     }
  1614.     down = At_Y2
  1615.     y2 = At_Y2
  1616.     up = In_Hall_Of_Mists
  1617. ;
  1618.  
  1619. At_Window_On_Pit_1: CCR_room
  1620.     sdesc = "At Window on Pit"
  1621.     ldesc = {
  1622.         I(); "You're at a low window overlooking a huge pit, 
  1623.         which extends up out of sight.  A floor is 
  1624.         indistinctly visible over 50 feet below.  Traces of 
  1625.         white mist cover the floor of the pit, becoming 
  1626.         thicker to the right. Marks in the dust around the 
  1627.         window would seem to indicate that someone has been 
  1628.         here recently.  Directly across the pit from you and 
  1629.         25 feet away there is a similar window looking into a 
  1630.         lighted room.  A shadowy figure can be seen there 
  1631.         peering back at you.";
  1632.     }
  1633.     east = At_Y2
  1634.     y2 = At_Y2
  1635.     jump = { return broken_neck.death; }
  1636. ;
  1637. Window: floatingdecoration
  1638.     sdesc = "window"
  1639.     ldesc = "It looks like a regular window."
  1640.     noun = 'window'
  1641.     adjective = 'low'
  1642.     loclist = [ At_Window_On_Pit_1  At_Window_On_Pit_2 ]
  1643.  
  1644.     verDoOpen(actor) = {}
  1645.     doOpen(actor) = { "OK, the window is now open."; }
  1646.     verDoClose(actor) = {}
  1647.     doClose(actor) = { "OK, the window is now closed."; }
  1648. ;
  1649. WindowPit: floatingdecoration
  1650.     sdesc = "huge pit"
  1651.     ldesc = {
  1652.         "It's so deep you can barely make out the floor below,
  1653.         and the top isn't visible at all.";
  1654.     }
  1655.     noun = 'pit'
  1656.     adjective = 'deep' 'large'
  1657.     loclist = [ At_Window_On_Pit_1  At_Window_On_Pit_2 ]
  1658. ;
  1659. MarksInTheDust: floatingdecoration
  1660.     sdesc = "marks in the dust"
  1661.     adesc = { self.sdesc; }
  1662.     ldesc = "Evidently you're not alone here."
  1663.     loclist = [ At_Window_On_Pit_1  At_Window_On_Pit_2 ]
  1664. ;
  1665. ShadowyFigure: floatingdecoration
  1666.     sdesc = "shadowy figure"
  1667.     ldesc = {
  1668.         "The shadowy figure seems to be trying to attract 
  1669.         your attention.";
  1670.     }
  1671.     noun = 'figure' 'shadow' 'person' 'individual'
  1672.     adjective = 'shadowy' 'mysterious'
  1673.     loclist = [ At_Window_On_Pit_1  At_Window_On_Pit_2 ]
  1674. ;
  1675. In_Dirty_Passage: CCR_room
  1676.     sdesc = "In Dirty Passage"
  1677.     ldesc = {
  1678.         I(); "You are in a dirty broken passage.  To the east 
  1679.         is a crawl.  To the west is a large passage.  Above 
  1680.         you is a hole to another passage.";
  1681.     }
  1682.     east = On_Brink_Of_Pit
  1683.     crawl = On_Brink_Of_Pit
  1684.     up = Low_N_S_Passage
  1685.     hole = Low_N_S_Passage
  1686.     west = In_Dusty_Rock_Room
  1687.     bedquilt = In_Bedquilt
  1688.     slab = In_Slab_Room    // DMB: this is only in some versions
  1689. ;
  1690.  
  1691. On_Brink_Of_Pit: CCR_room
  1692.     sdesc = "On Brink of Pit"
  1693.     ldesc = {
  1694.         I(); "You are on the brink of a small clean climbable 
  1695.         pit.  A crawl leads west.";
  1696.     }
  1697.     west = In_Dirty_Passage
  1698.     crawl = In_Dirty_Passage
  1699.     down = In_Pit
  1700.     pit = In_Pit
  1701.     climb = In_Pit
  1702.     in = In_Pit    // DMB: added
  1703. ;
  1704. CleanPit: CCR_decoration
  1705.     sdesc = "small pit"
  1706.     ldesc = "It looks like you might be able to climb down into it."
  1707.     noun = 'pit'
  1708.     adjective = 'small' 'clean' 'climable'
  1709.     location = On_Brink_Of_Pit
  1710.  
  1711.     verDoClimb(actor) = {}
  1712.     doClimb(actor) = { Me.travelTo(self.location.climb); }
  1713.     verDoEnter(actor) = {}
  1714.     doEnter(actor) = { self.doClimb(actor); }
  1715. ;
  1716. In_Pit: CCR_room, NoNPC
  1717.     sdesc = "In Pit"
  1718.     ldesc = {
  1719.         I(); "You are in the bottom of a small pit with a 
  1720.         little stream, which enters and exits through tiny 
  1721.         slits.";
  1722.     }
  1723.     climb = On_Brink_Of_Pit
  1724.     up = On_Brink_Of_Pit
  1725.     out = On_Brink_Of_Pit
  1726.  
  1727.     slit = { return self.down; }
  1728.     stream = { return self.down; }
  1729.     upstream = { return self.down; }
  1730.     downstream = { return self.down; }
  1731.     down = {
  1732.         // In the original, the same message given
  1733.         // in At_Slit_In_Streambed was used here.
  1734.         // Since it's not quite right (and was probably only
  1735.         // reused to save space), I've changed it slightly.
  1736.  
  1737.         "You don't fit through the tiny slits!";
  1738.         return nil;
  1739.     }
  1740. ;
  1741. PitSlits: decoration
  1742.     sdesc = "tiny slits"
  1743.     adesc = { self.sdesc; }
  1744.     ldesc = {
  1745.         "The slits form a complex pattern in the rock.";
  1746.     }
  1747.     location = In_Pit
  1748.     noun = 'slit' 'slits'
  1749.     adjective = 'tiny'
  1750. ;
  1751.  
  1752. In_Dusty_Rock_Room: CCR_room
  1753.     sdesc = "In Dusty Rock Room"
  1754.     ldesc = {
  1755.         I(); "You are in a large room full of dusty rocks.  
  1756.         There is a big hole in the floor.  There are cracks 
  1757.         everywhere, and a passage leading east.";
  1758.     }
  1759.     east = In_Dirty_Passage
  1760.     passage = In_Dirty_Passage
  1761.     down = At_Complex_Junction
  1762.     hole = At_Complex_Junction
  1763.     floor = At_Complex_Junction
  1764.     bedquilt = In_Bedquilt
  1765. ;
  1766. DustyRocks: CCR_decoration
  1767.     sdesc = "dusty rocks"
  1768.     ldesc = "They're just rocks.  (Dusty ones, that is.)"
  1769.     location = In_Dusty_Rock_Room
  1770.     noun = 'rocks' 'boulders' 'stones' 'rock' 'boulder' 'stone'
  1771.     adjective = 'dusty' 'dirty'
  1772. ;
  1773.  
  1774. At_West_End_Of_Hall_Of_Mists: CCR_room
  1775.     sdesc = "At West End of Hall of Mists"
  1776.     ldesc = {
  1777.         I(); "You are at the west end of the hall of mists.  
  1778.         A low wide crawl continues west and another goes 
  1779.         north.  To the south is a little passage 6 feet off 
  1780.         the floor.";
  1781.     }
  1782.     south = Alike_Maze_1
  1783.     up = Alike_Maze_1
  1784.     passage = Alike_Maze_1
  1785.     climb = Alike_Maze_1
  1786.     east = West_Side_Of_Fissure
  1787.     west = At_East_End_Of_Long_Hall
  1788.     crawl = At_East_End_Of_Long_Hall
  1789.  
  1790.     north = {
  1791.         "You have crawled through a very low wide passage 
  1792.         parallel to and north of the hall of mists.\b";
  1793.  
  1794.         return West_Side_Of_Fissure;
  1795.     }    
  1796. ;
  1797.  
  1798. Alike_Maze_1: CCR_alike_maze_room
  1799.     up = At_West_End_Of_Hall_Of_Mists
  1800.     north = Alike_Maze_1
  1801.     east = Alike_Maze_2
  1802.     south = Alike_Maze_4
  1803.     west = Alike_Maze_11
  1804. ;
  1805.  
  1806. Alike_Maze_2: CCR_alike_maze_room
  1807.     west = Alike_Maze_1
  1808.     south = Alike_Maze_3
  1809.     east = Alike_Maze_4
  1810. ;
  1811.  
  1812. Alike_Maze_3: CCR_alike_maze_room
  1813.     east = Alike_Maze_2
  1814.     down = Dead_End_3
  1815.     south = Alike_Maze_6
  1816.     north = Dead_End_13
  1817. ;
  1818.  
  1819. Alike_Maze_4: CCR_alike_maze_room
  1820.     west = Alike_Maze_1
  1821.     north = Alike_Maze_2
  1822.     east = Dead_End_1
  1823.     south = Dead_End_2
  1824.     up = Alike_Maze_14
  1825.     down = Alike_Maze_14
  1826. ;
  1827.  
  1828. Dead_End_1: CCR_dead_end_room
  1829.     west = Alike_Maze_4
  1830.     out = Alike_Maze_4
  1831. ;
  1832.  
  1833. Dead_End_2: CCR_dead_end_room
  1834.     east = Alike_Maze_4
  1835.     out = Alike_Maze_4
  1836. ;
  1837.  
  1838. Dead_End_3: CCR_dead_end_room
  1839.     up = Alike_Maze_3
  1840.     out = Alike_Maze_3
  1841. ;
  1842.  
  1843. Alike_Maze_5: CCR_alike_maze_room
  1844.     east = Alike_Maze_6
  1845.     west = Alike_Maze_7
  1846. ;
  1847.  
  1848. Alike_Maze_6: CCR_alike_maze_room
  1849.     east = Alike_Maze_3
  1850.     west = Alike_Maze_5
  1851.     down = Alike_Maze_7
  1852.     south = Alike_Maze_8
  1853. ;
  1854.  
  1855. Alike_Maze_7: CCR_alike_maze_room
  1856.     west = Alike_Maze_5
  1857.     up = Alike_Maze_6
  1858.     east = Alike_Maze_8
  1859.     south = Alike_Maze_9
  1860. ;
  1861.  
  1862. Alike_Maze_8: CCR_alike_maze_room
  1863.     west = Alike_Maze_6
  1864.     east = Alike_Maze_7
  1865.     south = Alike_Maze_8
  1866.     up = Alike_Maze_9
  1867.     north = Alike_Maze_10
  1868.     down = Dead_End_12
  1869. ;
  1870.  
  1871. Alike_Maze_9: CCR_alike_maze_room
  1872.     west = Alike_Maze_7
  1873.     north = Alike_Maze_8
  1874.     south = Dead_End_4
  1875. ;
  1876.  
  1877. Dead_End_4: CCR_dead_end_room
  1878.     west = Alike_Maze_9
  1879.     out = Alike_Maze_9
  1880. ;
  1881.  
  1882. Alike_Maze_10: CCR_alike_maze_room
  1883.     west = Alike_Maze_8
  1884.     north = Alike_Maze_10
  1885.     down = Dead_End_5
  1886.     east = At_Brink_Of_Pit
  1887. ;
  1888.  
  1889. Dead_End_5: CCR_dead_end_room
  1890.     up = Alike_Maze_10
  1891.     out = Alike_Maze_10
  1892. ;
  1893.  
  1894. At_Brink_Of_Pit: CCR_room
  1895.     sdesc = "At Brink of Pit"
  1896.     ldesc = {
  1897.         I(); "You are on the brink of a thirty foot pit with 
  1898.         a massive orange column down one wall.  You could 
  1899.         climb down here but you could not get back up.  The 
  1900.         maze continues at this level.";
  1901.     }
  1902.     down = In_Bird_Chamber
  1903.     climb = In_Bird_Chamber
  1904.     west = Alike_Maze_10
  1905.     south = Dead_End_6
  1906.     north = Alike_Maze_12
  1907.     east = Alike_Maze_13
  1908. ;
  1909. OrangeColumn: CCR_decoration
  1910.     sdesc = "massive orange column"
  1911.     ldesc = "It looks like you could climb down it."
  1912.     noun = 'column'
  1913.     adjective = 'massive' 'orange' 'big' 'huge'
  1914.     location = At_Brink_Of_Pit
  1915.     
  1916.     verDoClimb(actor) = {}
  1917.     doClimb(actor) = { Me.travelTo(self.location.down); }
  1918. ;
  1919. ThirtyFootPit: CCR_decoration
  1920.     sdesc = "pit"
  1921.     ldesc = "You'll have to climb down to find out anything more..."
  1922.     noun = 'pit'
  1923.     adjective = 'thirty' 'foot' 'thirty-foot' '30-foot'
  1924.     location = At_Brink_Of_Pit
  1925.  
  1926.     verDoClimb(actor) = {}
  1927.     doClimb(actor) = { Me.travelTo(self.location.down); }
  1928.     verDoEnter(actor) = {}
  1929.     doEnter(actor) = { self.doClimb(actor); }
  1930. ;
  1931.  
  1932. Dead_End_6: CCR_dead_end_room
  1933.     east = At_Brink_Of_Pit
  1934.     out = At_Brink_Of_Pit
  1935. ;
  1936.  
  1937. At_East_End_Of_Long_Hall: CCR_room
  1938.     sdesc = "At East End of Long Hall"
  1939.     ldesc = {
  1940.         I(); "You are at the east end of a very long hall 
  1941.         apparently without side chambers.  To the east a low 
  1942.         wide crawl slants up.  To the north a round two foot 
  1943.         hole slants down.";
  1944.     }
  1945.     east = At_West_End_Of_Hall_Of_Mists
  1946.     up = At_West_End_Of_Hall_Of_Mists
  1947.     crawl = At_West_End_Of_Hall_Of_Mists
  1948.     west = At_West_End_Of_Long_Hall
  1949.     north = Crossover
  1950.     down = Crossover
  1951.     hole = Crossover
  1952. ;
  1953.  
  1954. At_West_End_Of_Long_Hall: CCR_room
  1955.     sdesc = "At West End of Long Hall"
  1956.     ldesc = {
  1957.         I(); "You are at the west end of a very long 
  1958.         featureless hall.  The hall joins up with a narrow 
  1959.         north/south passage.";
  1960.     }
  1961.     east = At_East_End_Of_Long_Hall
  1962.     north = Crossover
  1963.     south = Different_Maze_1
  1964. ;
  1965.  
  1966. Crossover: CCR_room
  1967.     sdesc = "N/S and E/W Crossover"
  1968.     ldesc = {
  1969.         I(); "You are at a crossover of a high N/S passage 
  1970.         and a low E/W one.";
  1971.     }
  1972.     west = At_East_End_Of_Long_Hall
  1973.     north = Dead_End_7
  1974.     east = In_West_Side_Chamber
  1975.     south = At_West_End_Of_Long_Hall
  1976. ;
  1977. TheCrossover: CCR_decoration
  1978.     sdesc = "crossover"
  1979.     ldesc = "You know as much as I do at this point."
  1980.     noun = 'crossover' 'over'
  1981.     adjective = 'cross'
  1982.     location = Crossover
  1983. ;
  1984.  
  1985. Dead_End_7: CCR_dead_end_room
  1986.     south = Crossover
  1987.     out = Crossover
  1988. ;
  1989.  
  1990. At_Complex_Junction: CCR_room
  1991.     sdesc = "At Complex Junction"
  1992.     ldesc = {
  1993.         I(); "You are at a complex junction.  A low hands and 
  1994.         knees passage from the north joins a higher crawl 
  1995.         from the east to make a walking passage going west.  
  1996.         There is also a large room above.  The air is damp 
  1997.         here.";
  1998.     }
  1999.     up = In_Dusty_Rock_Room
  2000.     climb = In_Dusty_Rock_Room
  2001.     toroom = In_Dusty_Rock_Room
  2002.     west = In_Bedquilt
  2003.     bedquilt = In_Bedquilt
  2004.     north = In_Shell_Room
  2005.     shell = In_Shell_Room
  2006.     east = In_Anteroom
  2007. ;
  2008.  
  2009. In_Bedquilt: CCR_room
  2010.     sdesc = "In Bedquilt"
  2011.     ldesc = {
  2012.         I(); "You are in bedquilt, a long east/west passage 
  2013.         with holes everywhere. To explore at random select 
  2014.         north, south, up, or down.";
  2015.     }
  2016.     east = At_Complex_Junction
  2017.     west = In_Swiss_Cheese_Room
  2018.     south = {
  2019.         if (rand(100) <= 80)
  2020.             return crawled_around.message;
  2021.         else
  2022.             return self.slab;
  2023.     }
  2024.     slab = In_Slab_Room
  2025.  
  2026.     up = {
  2027.         if (rand(100) <= 80)
  2028.             return crawled_around.message;
  2029.         else if (rand(100) <= 50)
  2030.             return In_Secret_N_S_Canyon_1;
  2031.         else
  2032.             return In_Dusty_Rock_Room;
  2033.     }
  2034.  
  2035.     north = {
  2036.         if (rand(100) <= 60)
  2037.             return crawled_around.message;
  2038.         else if (rand(100) <= 75)
  2039.             return In_Large_Low_Room;
  2040.         else
  2041.             return At_Junction_Of_Three_Secret_Canyons;
  2042.     }
  2043.  
  2044.     down = {
  2045.         if (rand(100) <= 80)
  2046.             return crawled_around.message;
  2047.         else
  2048.             return In_Anteroom;
  2049.     }
  2050.  
  2051.     //
  2052.     // Let the NPC's go everywhere out of here too.
  2053.     //
  2054.     NPCexit1 = In_Secret_N_S_Canyon_1
  2055.     NPCexit2 = In_Dusty_Rock_Room
  2056.     NPCexit3 = In_Large_Low_Room
  2057.     NPCexit4 = At_Junction_Of_Three_Secret_Canyons
  2058.     NPCexit5 = In_Anteroom
  2059. ;
  2060.  
  2061. In_Swiss_Cheese_Room: CCR_room
  2062.     sdesc = "In Swiss Cheese Room"
  2063.     ldesc = {
  2064.         I(); "You are in a room whose walls resemble swiss 
  2065.         cheese.  Obvious passages go west, east, ne, and nw.  
  2066.         Part of the room is occupied by a large bedrock 
  2067.         block.";
  2068.     }
  2069.     ne = In_Bedquilt
  2070.     west = At_East_End_Of_Twopit_Room
  2071.     south = {
  2072.         if (rand(100) <= 80)
  2073.             return crawled_around.message;
  2074.         else
  2075.             return self.canyon;
  2076.     }
  2077.     canyon = In_Tall_E_W_Canyon
  2078.  
  2079.     east = In_Soft_Room
  2080.     nw = {
  2081.         if (rand(100) <= 50)
  2082.             return crawled_around.message;
  2083.         else
  2084.             return self.oriental;
  2085.     }
  2086.     oriental = In_Oriental_Room
  2087. ;
  2088. BedrockBlock: CCR_decoration
  2089.     sdesc = "bedrock block"
  2090.     ldesc = "It's just a huge block."
  2091.     noun = 'block'
  2092.     adjective = 'bedrock' 'large'
  2093.     location = In_Swiss_Cheese_Room
  2094.  
  2095.     verDoLookunder(actor) = { "Surely you're joking."; }
  2096.     verDoMove(actor) = { self.verDoLookunder(actor); }
  2097.     verifyRemove(actor) = { self.verDoLookunder(actor); }
  2098. ;
  2099.  
  2100. At_East_End_Of_Twopit_Room: CCR_room
  2101.     sdesc = "At East End of Twopit Room"
  2102.     ldesc = {
  2103.         I(); "You are at the east end of the twopit room.  
  2104.         The floor here is littered with thin rock slabs, 
  2105.         which make it easy to descend the pits. There is a 
  2106.         path here bypassing the pits to connect passages from 
  2107.         east and west.  There are holes all over, but the 
  2108.         only big one is on the wall directly over the west 
  2109.         pit where you can't get to it.";
  2110.  
  2111.         if (PlantStickingUp.isIn(self)) {
  2112.             P(); I(); PlantStickingUp.ldesc;
  2113.         }
  2114.     }
  2115.     east = In_Swiss_Cheese_Room
  2116.     west = At_West_End_Of_Twopit_Room
  2117.     across = At_West_End_Of_Twopit_Room
  2118.     down = In_East_Pit
  2119.     pit = In_East_Pit
  2120. ;
  2121. Slabs: CCR_decoration
  2122.     sdesc = "thin rock slabs"
  2123.     adesc = { self.sdesc; }
  2124.     ldesc = "They almost form natural stairs down into the pit."
  2125.     noun = 'slabs' 'slab' 'rocks' 'stairs'
  2126.     adjective = 'thin' 'rock'
  2127.     location = At_East_End_Of_Twopit_Room
  2128.  
  2129.     verDoLookunder(actor) = { "Surely you're joking."; }
  2130.     verDoMove(actor) = { self.verDoLookunder(actor); }
  2131.     verifyRemove(actor) = { self.verDoLookunder(actor); }
  2132. ;
  2133.  
  2134. In_Slab_Room: CCR_room
  2135.     sdesc = "In Slab Room"
  2136.     ldesc = {
  2137.         I(); "You are in a large low circular chamber whose 
  2138.         floor is an immense slab fallen from the ceiling 
  2139.         (slab room).  East and west there once were large 
  2140.         passages, but they are now filled with boulders.  Low 
  2141.         small passages go north and south, and the south one 
  2142.         quickly bends west around the boulders.";
  2143.     }
  2144.     south = At_West_End_Of_Twopit_Room
  2145.     up = In_Secret_N_S_Canyon_0
  2146.     climb = In_Secret_N_S_Canyon_0
  2147.     north = In_Bedquilt
  2148. ;
  2149. Slab: CCR_decoration
  2150.     sdesc = "slab"
  2151.     ldesc = "It is now the floor here."
  2152.     noun = 'slab'
  2153.     adjective = 'immense'
  2154.     location = In_Slab_Room
  2155. ;
  2156. SlabBoulders: CCR_decoration
  2157.     sdesc = "boulders"
  2158.     ldesc = "They're just ordinary boulders."
  2159.     noun = 'boulder' 'boulders' 'rocks' 'stones'
  2160.     location = In_Slab_Room
  2161. ;
  2162.  
  2163. In_Secret_N_S_Canyon_0: CCR_room
  2164.     sdesc = "In Secret N/S Canyon"
  2165.     ldesc = {
  2166.         I(); "You are in a secret N/S canyon above a large 
  2167.         room.";
  2168.     }
  2169.     down = In_Slab_Room
  2170.     slab = In_Slab_Room
  2171.  
  2172.     south = {
  2173.         In_Secret_Canyon.enteredfrom := self;
  2174.         return In_Secret_Canyon;
  2175.     }
  2176.  
  2177.     north = In_Mirror_Canyon
  2178.     reservoir = At_Reservoir
  2179.  
  2180.     //
  2181.     // Let NPC's go into the secret canyon too, without regard to
  2182.     // whether the dragon's there.
  2183.     //
  2184.     NPCexit1 = In_Secret_Canyon
  2185. ;
  2186.  
  2187. In_Secret_N_S_Canyon_1: CCR_room
  2188.     sdesc = "In Secret N/S Canyon"
  2189.     ldesc = {
  2190.         I(); "You are in a secret N/S canyon above a sizable 
  2191.         passage.";
  2192.     }
  2193.     north = At_Junction_Of_Three_Secret_Canyons
  2194.     down = In_Bedquilt
  2195.     passage = In_Bedquilt
  2196.     south = Atop_Stalactite
  2197. ;
  2198.  
  2199. At_Junction_Of_Three_Secret_Canyons: CCR_room
  2200.     sdesc = "At Junction of Three Secret Canyons"
  2201.     ldesc = {
  2202.         I(); "You are in a secret canyon at a junction of 
  2203.         three canyons, bearing north, south, and se.  The 
  2204.         north one is as tall as the other two combined.";
  2205.     }
  2206.     se = In_Bedquilt
  2207.     south = In_Secret_N_S_Canyon_1
  2208.     north = At_Window_On_Pit_2
  2209. ;
  2210.  
  2211. In_Large_Low_Room: CCR_room
  2212.     sdesc = "In Large Low Room"
  2213.     ldesc = {
  2214.         I(); "You are in a large low room.  Crawls lead 
  2215.         north, se, and sw.";
  2216.     }
  2217.     bedquilt = In_Bedquilt
  2218.     sw = In_Sloping_Corridor
  2219.     north = Dead_End_Crawl
  2220.     se = In_Oriental_Room
  2221.     oriental = In_Oriental_Room
  2222. ;
  2223.  
  2224. Dead_End_Crawl: CCR_dead_end_room
  2225.     sdesc = "Dead End Crawl"
  2226.     ldesc = {
  2227.         I(); "This is a dead end crawl.";
  2228.     }
  2229.     south = In_Large_Low_Room
  2230.     crawl = In_Large_Low_Room
  2231.     out = In_Large_Low_Room
  2232. ;
  2233.  
  2234. In_Secret_E_W_Canyon: CCR_room
  2235.     sdesc = "In Secret E/W Canyon Above Tight Canyon"
  2236.     ldesc = {
  2237.         I(); "You are in a secret canyon which here runs E/W. 
  2238.         It crosses over a very tight canyon 15 feet below.  
  2239.         If you go down you may not be able to get back up.";
  2240.     }
  2241.     east = In_Hall_Of_Mt_King
  2242.     west = {
  2243.         In_Secret_Canyon.enteredfrom := self;
  2244.         return In_Secret_Canyon;
  2245.     }
  2246.     down = In_N_S_Canyon
  2247.  
  2248.     //
  2249.     // Let NPC's go into the secret canyon too, without regard to
  2250.     // whether the dragon's there.
  2251.     //
  2252.     NPCexit1 = In_Secret_Canyon
  2253. ;
  2254.  
  2255. In_N_S_Canyon: CCR_room
  2256.     sdesc = "In N/S Canyon"
  2257.     ldesc = {
  2258.         I(); "You are at a wide place in a very tight N/S 
  2259.         canyon.";
  2260.     }
  2261.     south = Canyon_Dead_End
  2262.     north = In_Tall_E_W_Canyon
  2263. ;
  2264.  
  2265. Canyon_Dead_End: CCR_dead_end_room
  2266.     sdesc = "Canyon Dead End"
  2267.     ldesc = {
  2268.         I(); "The canyon here becomes too tight to go further 
  2269.         south.";
  2270.     }
  2271.     north = In_N_S_Canyon
  2272. ;
  2273.  
  2274. In_Tall_E_W_Canyon: CCR_room
  2275.     sdesc = "In Tall E/W Canyon"
  2276.     ldesc = {
  2277.         I(); "You are in a tall E/W canyon.  A low tight 
  2278.         crawl goes 3 feet north and seems to open up.";
  2279.     }
  2280.     east = In_N_S_Canyon
  2281.     west = Dead_End_8
  2282.     north = In_Swiss_Cheese_Room
  2283.     crawl = In_Swiss_Cheese_Room
  2284. ;
  2285.  
  2286. Dead_End_8: CCR_dead_end_room
  2287.     ldesc = {
  2288.         I(); "The canyon runs into a mass of boulders -- dead 
  2289.         end.";
  2290.     }
  2291.     south = In_Tall_E_W_Canyon
  2292.     out = In_Tall_E_W_Canyon    // DMB: added
  2293. ;
  2294. MassOfBoulders: CCR_decoration
  2295.     sdesc = "mass of boulders"
  2296.     ldesc = "They just like ordinary boulders."
  2297.     noun = 'boulders' 'mass'
  2298.     location = Dead_End_8
  2299. ;
  2300.  
  2301. Alike_Maze_11: CCR_alike_maze_room
  2302.     north = Alike_Maze_1
  2303.     west = Alike_Maze_11
  2304.     south = Alike_Maze_11
  2305.     east = Dead_End_9
  2306. ;
  2307.  
  2308. Dead_End_9: CCR_dead_end_room
  2309.     west = Alike_Maze_11
  2310.     out = Alike_Maze_11
  2311. ;
  2312.  
  2313. Dead_End_10: CCR_dead_end_room
  2314.     south = Alike_Maze_3
  2315.     out = Alike_Maze_3
  2316. ;
  2317.  
  2318. Alike_Maze_12: CCR_alike_maze_room
  2319.     south = At_Brink_Of_Pit
  2320.     east = Alike_Maze_13
  2321.     west = Dead_End_11
  2322. ;
  2323.  
  2324. Alike_Maze_13: CCR_alike_maze_room
  2325.     north = At_Brink_Of_Pit
  2326.     west = Alike_Maze_12
  2327.     nw = Dead_End_13
  2328. ;
  2329.  
  2330. Dead_End_11: CCR_dead_end_room
  2331.     east = Alike_Maze_12
  2332.     out = Alike_Maze_12
  2333. ;
  2334.  
  2335. Dead_End_12: CCR_dead_end_room
  2336.     up = Alike_Maze_8
  2337.     out = Alike_Maze_8
  2338. ;
  2339.  
  2340. Alike_Maze_14: CCR_alike_maze_room
  2341.     up = Alike_Maze_4
  2342.     down = Alike_Maze_4
  2343. ;
  2344.  
  2345. In_Narrow_Corridor: CCR_room
  2346.     sdesc = "In Narrow Corridor"
  2347.     ldesc = {
  2348.         I(); "You are in a long, narrow corridor stretching 
  2349.         out of sight to the west.  At the eastern end is a 
  2350.         hole through which you can see a profusion of 
  2351.         leaves.";
  2352.     }
  2353.     down = In_West_Pit
  2354.     climb = In_West_Pit
  2355.     east = In_West_Pit
  2356.     jump = { return broken_neck.death; }
  2357.     west = In_Giant_Room
  2358.     giant = In_Giant_Room
  2359. ;
  2360. Leaves: CCR_decoration
  2361.     sdesc = "leaves"
  2362.     ldesc = {
  2363.         "The leaves appear to be attached to the beanstalk 
  2364.         you climbed to get here.";
  2365.     }
  2366.     location = In_Narrow_Corridor
  2367.     noun = 'leaf' 'leaves' 'plant' 'tree' 'stalk' 'beanstalk' 'profusion'
  2368. ;
  2369.  
  2370. At_Steep_Incline_Above_Large_Room: CCR_room
  2371.     sdesc = "At Steep Incline Above Large Room"
  2372.     ldesc = {
  2373.         I(); "You are at the top of a steep incline above a 
  2374.         large room.  You could climb down here, but you would 
  2375.         not be able to climb up.  There is a passage leading 
  2376.         back to the north.";
  2377.     }
  2378.     north = In_Cavern_With_Waterfall
  2379.     cavern = In_Cavern_With_Waterfall
  2380.     passage = In_Cavern_With_Waterfall
  2381.     down = In_Large_Low_Room
  2382.     climb = In_Large_Low_Room
  2383. ;
  2384.  
  2385. In_Giant_Room: CCR_room
  2386.     sdesc = "In Giant Room"
  2387.     ldesc = {
  2388.         I(); "You are in the giant room.  The ceiling here is 
  2389.         too high up for your lamp to show it.  Cavernous 
  2390.         passages lead east, north, and south.  On the west 
  2391.         wall is scrawled the inscription, \"Fee fie foe foo\" 
  2392.         [sic].";
  2393.     }
  2394.     south = In_Narrow_Corridor
  2395.     east = At_Recent_Cave_In
  2396.     north = In_Immense_N_S_Passage
  2397. ;
  2398. Inscription: CCR_decoration, readable
  2399.     sdesc = "scrawled inscription"
  2400.     ldesc = "It says, \"Fee fie foe foo [sic].\""
  2401.     noun = 'inscription' 'writing' 'scrawl'
  2402.     adjective = 'scrawled'
  2403.     location = In_Giant_Room
  2404. ;
  2405.  
  2406. At_Recent_Cave_In: CCR_room
  2407.     sdesc = "At Recent Cave-in"
  2408.     ldesc = {
  2409.         I(); "The passage here is blocked by a recent 
  2410.         cave-in.";
  2411.     }
  2412.     south = In_Giant_Room
  2413.     giant = In_Giant_Room
  2414.     out = In_Giant_Room
  2415. ;
  2416. CaveIn: CCR_decoration
  2417.     sdesc = "cave-in"
  2418.     ldesc = { self.location.ldesc; }
  2419.     noun = 'in' 'cave-in'
  2420.     adjective = 'cave'
  2421.     location = At_Recent_Cave_In
  2422. ;
  2423.  
  2424. In_Immense_N_S_Passage: CCR_room
  2425.     sdesc = "In Immense N/S Passage"
  2426.     ldesc = {
  2427.         I(); "You are at one end of an immense north/south 
  2428.         passage. ";
  2429.  
  2430.         if (not RustyDoor.isoiled)
  2431.              "The way north is barred by a massive, rusty, 
  2432.             iron door.";
  2433.         else
  2434.             "The way north leads through a massive, 
  2435.             rusty, iron door.";
  2436.     }
  2437.     south = In_Giant_Room
  2438.     giant = In_Giant_Room
  2439.     passage = In_Giant_Room
  2440.  
  2441.     enter = { return self.north; }
  2442.     cavern = { return self.north; }
  2443.     north = {
  2444.         if (RustyDoor.isoiled) {
  2445.             return In_Cavern_With_Waterfall;
  2446.         }
  2447.         else {
  2448.             "The door is extremely rusty and refuses to open.";
  2449.             return nil;
  2450.         }
  2451.     }
  2452.  
  2453.     //
  2454.     // Only let NPC's go through the door once it's open.
  2455.     //
  2456.     NPCexit1 = {
  2457.         if (RustyDoor.isoiled)
  2458.             return In_Cavern_With_Waterfall;
  2459.         else
  2460.             return nil;
  2461.     }
  2462. ;
  2463. RustyDoor: CCR_decoration
  2464.     isoiled = nil
  2465.  
  2466.     sdesc = "rusty door"
  2467.     ldesc = "It's just a big iron door."
  2468.     location = In_Immense_N_S_Passage
  2469.     noun = 'door' 'hinge' 'hinges'
  2470.     adjective = 'massive' 'rusty' 'iron'
  2471.  
  2472.     verDoOpen(actor) = {
  2473.         if (self.oiled)
  2474.             "It's already open.";
  2475.         else
  2476.             "The hinges are quite thoroughly rusted now 
  2477.             and won't budge.";
  2478.     }
  2479.     verDoClose(actor) = {
  2480.         if (self.oiled)
  2481.             "No problem there -- it already is.";
  2482.         else
  2483.             "With all the effort it took to get the door 
  2484.             open, I wouldn't suggest closing it again.";
  2485.     }
  2486.     verDoOil(actor) = {}
  2487.     doOil(actor) = {
  2488.         if (bottle.isIn(Me))
  2489.             bottle.doPourOn(actor, self);
  2490.         else
  2491.             "You have nothing to oil it with.";
  2492.     }
  2493. ;
  2494.  
  2495. In_Cavern_With_Waterfall: CCR_room
  2496.     sdesc = "In Cavern With Waterfall"
  2497.     ldesc = {
  2498.         I(); "You are in a magnificent cavern with a rushing 
  2499.         stream, which cascades over a sparkling waterfall 
  2500.         into a roaring whirlpool which disappears through a 
  2501.         hole in the floor.  Passages exit to the south and 
  2502.         west.";
  2503.     }
  2504.     south = In_Immense_N_S_Passage
  2505.     out = In_Immense_N_S_Passage
  2506.     giant = In_Giant_Room
  2507.     west = At_Steep_Incline_Above_Large_Room
  2508. ;
  2509. Waterfall: CCR_decoration
  2510.     sdesc = "waterfall"
  2511.     ldesc = "Wouldn't want to go down in in a barrel!"
  2512.     noun = 'waterfall' 'whirpool'
  2513.     adjective = 'sparkling' 'whirling'
  2514.     location = In_Cavern_With_Waterfall
  2515. ;
  2516.  
  2517. In_Soft_Room: CCR_room
  2518.     sdesc = "In Soft Room"
  2519.     ldesc = {
  2520.         I(); "You are in the soft room.  The walls are 
  2521.         covered with heavy curtains, the floor with a thick 
  2522.         pile carpet.  Moss covers the ceiling.";
  2523.     }
  2524.     west = In_Swiss_Cheese_Room
  2525.     out = In_Swiss_Cheese_Room
  2526. ;
  2527. Carpet: CCR_decoration
  2528.     sdesc = "carpet"
  2529.     ldesc = "The carpet is quite plush."
  2530.     noun = 'carpet' 'shag' 'pile'
  2531.     adjective = 'pile' 'heavy' 'thick'
  2532.     location = In_Soft_Room
  2533. ;
  2534. Curtains: CCR_decoration
  2535.     sdesc = "curtains"
  2536.     ldesc = "They seem to absorb sound very well."
  2537.     noun = 'curtain' 'curtains'
  2538.     adjective = 'heavy' 'thick'
  2539.     location = In_Soft_Room
  2540.  
  2541.     verifyRemove(actor) = { "Now don't go ripping up the place!"; }
  2542.     verDoLookbehind(actor) = {}
  2543.     doLookbehind(actor) = {
  2544.         "You don't find anything exciting behind the curtains.";
  2545.     }
  2546. ;
  2547. Moss: CCR_decoration
  2548.     sdesc = "moss"
  2549.     ldesc = "It just looks like your typical, everyday moss."
  2550.     noun = 'moss'
  2551.     adjective = 'typical' 'everyday'
  2552.     location = In_Soft_Room
  2553.  
  2554.     verifyRemove(actor) = { "It's too high up for you to reach."; }
  2555.     verDoEat(actor) = { "Eeeewwwww."; }
  2556. ;
  2557.  
  2558. In_Oriental_Room: CCR_room
  2559.     sdesc = "In Oriental Room"
  2560.     ldesc = {
  2561.         I(); "This is the oriental room.  Ancient oriental 
  2562.         cave drawings cover the walls.  A gently sloping 
  2563.         passage leads upward to the north, another passage 
  2564.         leads se, and a hands and knees crawl leads west.";
  2565.     }
  2566.     se = In_Swiss_Cheese_Room
  2567.     west = In_Large_Low_Room
  2568.     crawl = In_Large_Low_Room
  2569.     up = In_Misty_Cavern
  2570.     north = In_Misty_Cavern
  2571.     cavern = In_Misty_Cavern
  2572. ;
  2573. CaveDrawings: CCR_decoration
  2574.     sdesc = "ancient oriental drawings"
  2575.     ldesc = "They seem to depict people and animals."
  2576.     noun = 'paintings' 'drawings' 'art'
  2577.     adjective = 'cave' 'ancient' 'oriental'
  2578.     location = In_Oriental_Room
  2579. ;
  2580.  
  2581. In_Misty_Cavern: CCR_room
  2582.     sdesc = "In Misty Cavern"
  2583.     ldesc = {
  2584.         I(); "You are following a wide path around the outer 
  2585.         edge of a large cavern. Far below, through a heavy 
  2586.         white mist, strange splashing noises can be heard.  
  2587.         The mist rises up through a fissure in the ceiling.  
  2588.         The path exits to the south and west.";
  2589.     }
  2590.     south = In_Oriental_Room
  2591.     oriental = In_Oriental_Room
  2592.     west = In_Alcove
  2593. ;
  2594. CeilingFissure: CCR_decoration
  2595.     sdesc = "fissure"
  2596.     ldesc = "You can't really get close enough to examine it."
  2597.     noun = 'fissure'
  2598.     location = In_Misty_Cavern
  2599. ;
  2600.  
  2601. In_Alcove: CCR_room
  2602.     sdesc = "In Alcove"
  2603.     ldesc = {
  2604.         I(); "You are in an alcove.  A small northwest path seems 
  2605.         to widen after a short distance.  An extremely tight 
  2606.         tunnel leads east.  It looks like a very tight 
  2607.         squeeze.  An eerie light can be seen at the other 
  2608.         end.";
  2609.     }
  2610.     nw = In_Misty_Cavern
  2611.     cavern = In_Misty_Cavern
  2612.     passage = { return self.east; }
  2613.     east = {
  2614.         //
  2615.         // The player must be carrying only the emerald or
  2616.         // nothing at all to fit through the tight tunnel.
  2617.         //
  2618.         if (length(Me.contents) > 1)
  2619.             return wontfit.message;
  2620.         else if (length(Me.contents) = 1) {
  2621.             if (egg_sized_emerald.isIn(Me))
  2622.                 return In_Plover_Room;
  2623.             else
  2624.                 return wontfit.message;
  2625.         }
  2626.         else
  2627.             return In_Plover_Room;
  2628.     }
  2629.  
  2630.     //
  2631.     // Let NPC's go in the plover room regardless of what
  2632.     // they're carrying.  (Life's not fair in the Colossal Cave.)
  2633.     //
  2634.     NPCexit1 = In_Plover_Room
  2635. ;
  2636.  
  2637. In_Plover_Room: CCR_room, lightroom
  2638.     sdesc = "In Plover Room"
  2639.     ldesc = {
  2640.         I(); "You're in a small chamber lit by an eerie green 
  2641.         light.  An extremely narrow tunnel exits to the west. 
  2642.         A dark corridor leads northeast.";
  2643.     }
  2644.  
  2645.     passage = { return self.west; }
  2646.     out =  { return self.west; }
  2647.     west = {
  2648.         //
  2649.         // The player must be carrying only the emerald or
  2650.         // nothing at all to fit through the tight tunnel.
  2651.         //
  2652.         if (length(Me.contents) > 1)
  2653.             return wontfit.message;
  2654.         else if (length(Me.contents) = 1) {
  2655.             if (egg_sized_emerald.isIn(Me))
  2656.                 return In_Alcove;
  2657.             else
  2658.                 return wontfit.message;
  2659.         }
  2660.         else
  2661.             return In_Alcove;
  2662.     }
  2663.  
  2664.     ne = In_Dark_Room
  2665.     dark = In_Dark_Room
  2666.  
  2667.      plover = At_Y2
  2668.  
  2669.     //
  2670.     // Let NPC's leave the plover room regardless of what
  2671.     // they're carrying.  (Life's not fair in the Colossal Cave.)
  2672.     //
  2673.     NPCexit1 = In_Alcove
  2674. ;
  2675.  
  2676. In_Dark_Room: CCR_room
  2677.     sdesc = "In Dark Room"
  2678.     ldesc = {
  2679.         I(); "You're in the dark-room.  A corridor leading 
  2680.         south is the only exit."; P();
  2681.  
  2682.         I(); StoneTablet.ldesc; 
  2683.     }
  2684.     south = In_Plover_Room
  2685.     plover = In_Plover_Room
  2686.     out = In_Plover_Room
  2687. ;
  2688. StoneTablet: CCR_decoration
  2689.     sdesc = "stone tablet"
  2690.     ldesc = {
  2691.         "A massive stone tablet imbedded in the wall reads: 
  2692.         \"Congratulations on bringing light into the 
  2693.         dark-room!\"";
  2694.     }
  2695.     location = In_Dark_Room
  2696.     noun = 'tablet'
  2697.     adjective = 'massive' 'stone'
  2698. ;
  2699.  
  2700. In_Arched_Hall: CCR_room
  2701.     sdesc = "In Arched Hall"
  2702.     ldesc = {
  2703.         I(); "You are in an arched hall.  A coral passage 
  2704.         once continued up and east from here, but is now 
  2705.         blocked by debris.  The air smells of sea water.";
  2706.     }
  2707.     down = In_Shell_Room
  2708.     shell = In_Shell_Room
  2709.     out = In_Shell_Room
  2710. ;
  2711.  
  2712. In_Shell_Room: CCR_room
  2713.     sdesc = "In Shell Room"
  2714.     ldesc = {
  2715.         I(); "You're in a large room carved out of 
  2716.         sedimentary rock.  The floor and walls are littered 
  2717.         with bits of shells imbedded in the stone.  A shallow 
  2718.         passage proceeds downward, and a somewhat steeper one 
  2719.         leads up.  A low hands and knees passage enters from 
  2720.         the south.";
  2721.     }
  2722.     up = In_Arched_Hall
  2723.     hall = In_Arched_Hall
  2724.     down = In_Ragged_Corridor
  2725.     
  2726.     south = {
  2727.         if (giant_bivalve.isIn(Me)) {
  2728.             if (giant_bivalve.opened)
  2729.                 "You can't fit this five-foot oyster 
  2730.                 through that little passage!";
  2731.             else
  2732.                 "You can't fit this five-foot clam 
  2733.                 through that little passage!";
  2734.  
  2735.             return nil;
  2736.         }
  2737.         else 
  2738.             return At_Complex_Junction;
  2739.     }
  2740.  
  2741.     //
  2742.     // Let NPC's through.
  2743.     //
  2744.     NPCexit1 = At_Complex_Junction
  2745. ;
  2746.  
  2747. In_Ragged_Corridor: CCR_room
  2748.     sdesc = "In Ragged Corridor"
  2749.     ldesc = {
  2750.         I(); "You are in a long sloping corridor with ragged 
  2751.         sharp walls.";
  2752.     }
  2753.     up = In_Shell_Room
  2754.     shell = In_Shell_Room
  2755.     down = In_A_Cul_De_Sac
  2756. ;
  2757.  
  2758. In_A_Cul_De_Sac: CCR_room
  2759.     sdesc = "In a Cul-de-Sac"
  2760.     ldesc = {
  2761.         I(); "You are in a cul-de-sac about eight feet 
  2762.         across.";
  2763.     }
  2764.     up = In_Ragged_Corridor
  2765.     out = In_Ragged_Corridor
  2766.     shell = In_Shell_Room
  2767. ;
  2768.  
  2769. In_Anteroom: CCR_room
  2770.     sdesc = "In Anteroom"
  2771.     ldesc = {
  2772.         I(); "You are in an anteroom leading to a large 
  2773.         passage to the east.  Small passages go west and up.  
  2774.         The remnants of recent digging are evident."; P();
  2775.  
  2776.         I(); "A sign in midair here says \"Cave under 
  2777.         construction beyond this point. Proceed at own risk.  
  2778.         [Witt Construction Company]\"";
  2779.     }
  2780.     up = At_Complex_Junction
  2781.     west = In_Bedquilt
  2782.     east = At_Witts_End
  2783. ;
  2784. WittSign: CCR_decoration, readable
  2785.     sdesc = 'sign'
  2786.     ldesc = "It's hanging way above your head."
  2787.     readdesc = {
  2788.         "It says \"Cave under construction beyond this point. 
  2789.         Proceed at own risk.  [Witt Construction Company]\"";
  2790.     }
  2791.     noun = 'sign'
  2792.     adjective = 'hanging'
  2793.     location = In_Anteroom
  2794.  
  2795.     verifyRemove(actor) = { "No chance.  It's too far up."; }
  2796. ;
  2797.  
  2798. /*
  2799.  * This was off limits to NPC's in the original, but I don't see
  2800.  * any reason to keep that restriction since it seemed to be
  2801.  * related to some hackery in the way the movement worked.
  2802.  *
  2803.  * It could be argued that the pirate shouldn't show up in the mazes,
  2804.  * since his taking stuff away from the player could make mapping the
  2805.  * maze a real pain.
  2806.  */
  2807. Different_Maze_1: CCR_room
  2808.     sdesc = "Maze of Twisty Little Passages, All Different"
  2809.     ldesc = {
  2810.         I(); "You are in a maze of twisty little passages, 
  2811.         all different.";
  2812.     }
  2813.     south = Different_Maze_3
  2814.     sw = Different_Maze_4
  2815.     ne = Different_Maze_5
  2816.     se = Different_Maze_6
  2817.     up = Different_Maze_7
  2818.     nw = Different_Maze_8
  2819.     east = Different_Maze_9
  2820.     west = Different_Maze_10
  2821.     north = Different_Maze_11
  2822.     down = At_West_End_Of_Long_Hall
  2823. ;
  2824.  
  2825. At_Witts_End: CCR_room
  2826.     sdesc = "At Witt's End"
  2827.     ldesc = {
  2828.         I(); "You are at Witt's End.  Passages lead off in 
  2829.         *all* directions.";
  2830.     }
  2831.     east = {
  2832.         if (rand(100) <= 95) 
  2833.             return crawled_around.message;
  2834.         else
  2835.             return In_Anteroom;
  2836.     }
  2837.     west = {
  2838.         "You have crawled around in some little holes and 
  2839.         found your way blocked by a recent cave-in.  You are 
  2840.         now back in the main passage.";
  2841.  
  2842.         return nil;
  2843.     }
  2844.  
  2845.     north = { return self.east; }
  2846.     south = { return self.east; }
  2847.     ne = { return self.east; }
  2848.     se = { return self.east; }
  2849.     sw = { return self.east; }
  2850.     nw = { return self.east; }
  2851.     up = { return self.east; }
  2852.     down = { return self.east; }
  2853.  
  2854.     //
  2855.     // Let NPC's out of here with no trouble
  2856.     //
  2857.     NPCexit1 = In_Anteroom
  2858. ;
  2859.  
  2860. In_Mirror_Canyon: CCR_room
  2861.     sdesc = "In Mirror Canyon"
  2862.     ldesc = {
  2863.         I(); "You are in a north/south canyon about 25 feet 
  2864.         across.  The floor is covered by white mist seeping 
  2865.         in from the north.  The walls extend upward for well 
  2866.         over 100 feet.  Suspended from some unseen point far 
  2867.         above you, an enormous two-sided mirror is hanging 
  2868.         parallel to and midway between the canyon walls. ";
  2869.  
  2870.         "("; CanyonMirror.ldesc; ")"; 
  2871.  
  2872.         P(); I(); "A small window can be seen in either wall, 
  2873.         some fifty feet up.";
  2874.     }
  2875.     south = In_Secret_N_S_Canyon_0
  2876.     north = At_Reservoir
  2877.     reservior = At_Reservoir
  2878. ;
  2879. Mirror_1: CCR_decoration
  2880.     sdesc = "enormous mirror"
  2881.     ldesc = "It looks like an ordinary, albeit enormous, mirror."
  2882.     location = In_Mirror_Canyon
  2883.     noun = 'mirror'
  2884.     adjective = 'enormous' 'huge' 'big' 'large' 'suspended'
  2885.         'hanging' 'vanity' 'dwarvish'
  2886.  
  2887.     verDoBreak(actor) = { self.verifyRemove(actor); }
  2888.     verifyRemove(actor) = { "You can't reach it from here."; }
  2889. ;
  2890. CanyonMirror: CCR_decoration
  2891.     sdesc = "suspended mirror"
  2892.     ldesc = {
  2893.         "The mirror is obviously provided for the use of the 
  2894.         dwarves, who as you know, are extremely vain.";
  2895.     }
  2896.     noun = 'mirror'
  2897.     adjective = 'massive' 'hanging' 'suspended' 'dwarves\'' 'two-sided'
  2898.         'two' 'sided'
  2899.     location = In_Mirror_Canyon
  2900. ;
  2901.  
  2902. At_Window_On_Pit_2: CCR_room
  2903.     sdesc = "At Window on Pit"
  2904.     ldesc = {
  2905.         I(); "You're at a low window overlooking a huge pit, 
  2906.         which extends up out of sight.  A floor is 
  2907.         indistinctly visible over 50 feet below.  Traces of 
  2908.         white mist cover the floor of the pit, becoming 
  2909.         thicker to the left. Marks in the dust around the 
  2910.         window would seem to indicate that someone has been 
  2911.         here recently.  Directly across the pit from you and 
  2912.         25 feet away there is a similar window looking into a 
  2913.         lighted room.  A shadowy figure can be seen there 
  2914.         peering back at you.";
  2915.     }
  2916.     west = At_Junction_Of_Three_Secret_Canyons
  2917.     jump = { return broken_neck.death; }
  2918. ;
  2919.  
  2920. Atop_Stalactite: CCR_room
  2921.     sdesc = "Atop Stalactite"
  2922.     ldesc = {
  2923.         I(); "A large stalactite extends from the roof and 
  2924.         almost reaches the floor below.  You could climb down 
  2925.         it, and jump from it to the floor, but having done so 
  2926.         you would be unable to reach it to climb back up.";
  2927.     }
  2928.     north = In_Secret_N_S_Canyon_1
  2929.  
  2930.     jump = { return self.down; }
  2931.     climb = { return self.down; }
  2932.     down = {
  2933.         if (rand(100) <= 40)
  2934.             return Alike_Maze_6;
  2935.         else if (rand(100) <= 50)
  2936.             return Alike_Maze_9;
  2937.         else
  2938.             return Alike_Maze_4;
  2939.     }
  2940.  
  2941.     //
  2942.     // Let NPC's through to the maze
  2943.     //
  2944.     NPCexit1 = Alike_Maze_6
  2945.     NPCexit2 = Alike_Maze_9
  2946.     NPCexit3 = Alike_Maze_4
  2947. ;
  2948. Stalactite: CCR_decoration
  2949.     sdesc = "stalactite"
  2950.     ldesc = {
  2951.         "You could probably climb down it, but you can forget 
  2952.         coming back up.";
  2953.     }
  2954.     noun = 'stalactite' 'stalagmite' 'stalagtite'
  2955.     adjective = 'large'
  2956.     location = Atop_Stalactite
  2957.  
  2958.     verDoLookunder(actor) = { "Do get a grip on yourself."; }
  2959.     verDoMove(actor) = { self.verDoLookunder(actor); }
  2960.     verifyRemove(actor) = { self.verDoLookunder(actor); }
  2961. ;
  2962.  
  2963. Different_Maze_2: CCR_room
  2964.     sdesc = "Little Maze of Twisting Passages, All Different"
  2965.     ldesc = {
  2966.         I(); "You are in a little maze of twisting passages, 
  2967.         all different.";
  2968.     }
  2969.     sw = Different_Maze_3
  2970.     north = Different_Maze_4
  2971.     east = Different_Maze_5
  2972.     nw = Different_Maze_6
  2973.     se = Different_Maze_7
  2974.     ne = Different_Maze_8
  2975.     west = Different_Maze_9
  2976.     down = Different_Maze_10
  2977.     up = Different_Maze_11
  2978.     south = Dead_End_14
  2979. ;
  2980.  
  2981. At_Reservoir: CCR_room
  2982.     sdesc = "At Reservoir"
  2983.     ldesc = {
  2984.         I(); "You are at the edge of a large underground 
  2985.         reservoir.  An opaque cloud of white mist fills the 
  2986.         room and rises rapidly upward.  The lake is fed by a 
  2987.         stream, which tumbles out of a hole in the wall about 
  2988.         10 feet overhead and splashes noisily into the water 
  2989.         somewhere within the mist.  The only passage goes 
  2990.         back toward the south.";
  2991.     }
  2992.     south = In_Mirror_Canyon
  2993.     out = In_Mirror_Canyon
  2994.  
  2995.     //
  2996.     // The original had another exit, but the verb it was attached
  2997.     // to didn't exists.  I have no idea what was intended here...
  2998.     //
  2999.     // ??? = In_Mirror_Canyon
  3000. ;
  3001.  
  3002. //
  3003. // Here's where the pirate(s) keeps his treasure (as well as any loot
  3004. // he's swiped from the player).  Once the chest has been been found
  3005. // here, turn off the pirate(s) completely.  (This is how the original
  3006. // handled it, and it's thankfully merciful so I've kept it the same.)
  3007. //
  3008. Dead_End_13: CCR_dead_end_room, NoNPC
  3009.     se = Alike_Maze_13
  3010.     out = Alike_Maze_13    // DMB: added
  3011.  
  3012.     ldesc = "This is the pirate's dead end."
  3013.  
  3014.     enterRoom(actor) = {
  3015.         if (treasure_chest.isIn(Me) and not treasure_chest.spotted) {
  3016.             P(); I(); "You've found the pirate's treasure chest!";
  3017.             unnotify(Pirates, &move);
  3018.             treasure_chest.spotted := true;
  3019.             PirateMessage.moveInto(nil);
  3020.         }
  3021.  
  3022.         pass enterRoom;
  3023.     }
  3024. ;
  3025.  
  3026. On_Sw_Side_Of_Chasm: CCR_room
  3027.     sdesc = "On SW Side of Chasm"
  3028.     ldesc = {
  3029.         I(); "You are on one side of a large, deep chasm.  A 
  3030.         heavy white mist rising up from below obscures all 
  3031.         view of the far side.  A southwest path leads away 
  3032.         from the chasm into a winding corridor. ";
  3033.  
  3034.         RicketyBridge.xdesc;
  3035.  
  3036.         if (Troll.location = nil) {
  3037.             P(); I();
  3038.             "The troll is nowhere to be seen.";
  3039.         }
  3040.     }
  3041.     sw = In_Sloping_Corridor
  3042.  
  3043.     across = { return self.over; }
  3044.     cross = { return self.over; }
  3045.     ne = { return self.over; }
  3046.     over = {
  3047.         RicketyBridge.doCross(Me);
  3048.         return nil;
  3049.     }
  3050.     
  3051.     jump = {
  3052.         if (RicketyBridge.exists) {
  3053.             "I respectfully suggest you go across the 
  3054.             bridge instead of jumping.";
  3055.  
  3056.             return nil;
  3057.         }
  3058.         else
  3059.             return didnt_make_it.death;
  3060.     }
  3061.  
  3062.     //
  3063.     // No NPC exits because we don't want the pirate to be able
  3064.     // to go across the bridge and steal the player's return toll.
  3065.     // (All rooms on the other side of the bridge are off limits
  3066.     // to NPC's.)
  3067.     //
  3068.     // It would be OK for dwarves to show up over there, except
  3069.     // that they might run into the bear, a situation for which we don't
  3070.     // have any code.  (This is how the original was as well.)
  3071.     //
  3072. ;
  3073. RicketyBridge: CCR_decoration
  3074.     exists = true
  3075.  
  3076.     sdesc = "rickety bridge"
  3077.     ldesc = "It just looks like an ordinary, but unstable, bridge."
  3078.  
  3079.     xdesc = {
  3080.         if (self.exists) {
  3081.             "A rickety wooden bridge extends across the 
  3082.             chasm, vanishing into the mist."; P();
  3083.  
  3084.             I(); "A sign posted on the bridge reads, 
  3085.             \"Stop! Pay troll!\"";
  3086.         }
  3087.         else {
  3088.             "The wreckage of a bridge (and a dead bear) 
  3089.             can be seen at the bottom of the chasm.";
  3090.         }
  3091.     }
  3092.  
  3093.     noun = 'bridge'
  3094.     adjective = 'rickety' 'unstable' 'wobbly' 'rope'
  3095.  
  3096.     locationOK = true    // tell compiler OK for location to be method
  3097.     location = {
  3098.         if (self.exists) {
  3099.             if (Me.isIn(On_Sw_Side_Of_Chasm))
  3100.                 return On_Sw_Side_Of_Chasm;
  3101.             else
  3102.                 return On_Ne_Side_Of_Chasm;
  3103.         }
  3104.         else
  3105.             return nil;
  3106.     }
  3107.  
  3108.     verDoCross(actor) = {}
  3109.     doCross(actor) = {
  3110.         if (self.exists) {
  3111.             if (Troll.ispaid or Troll.location = nil)
  3112.                 self.cross;
  3113.             else {
  3114.                 if (Troll.isIn(self.location)) {
  3115.                     "The troll refuses to let you 
  3116.                     cross.";
  3117.                 }
  3118.                 else {
  3119.                     "The troll steps out from 
  3120.                     beneath the bridge and blocks 
  3121.                     your way.";
  3122.  
  3123.                     Troll.moveInto(self.location);
  3124.                 }
  3125.             }
  3126.         }
  3127.         else
  3128.             "There is no longer any way across the chasm.";
  3129.     }
  3130.  
  3131.     cross = {
  3132.         if (Bear.isfollowing) {
  3133.             "Just as you reach the other side, the bridge 
  3134.             buckles beneath the weight of the bear, which 
  3135.             was still following you around.  You scrabble 
  3136.             desperately for support, but as the bridge 
  3137.             collapses you stumble back and fall into the 
  3138.             chasm.";
  3139.  
  3140.             // Get rid of the bridge in case the
  3141.             // player gets reincarnated and
  3142.             // continues the game.
  3143.             self.exists := nil;
  3144.  
  3145.             // No more bear!
  3146.             Bear.exists := nil;
  3147.  
  3148.             die();
  3149.         }
  3150.         else if (Me.isIn(On_Sw_Side_Of_Chasm)) {
  3151.             Troll.ispaid := nil;
  3152.             Me.travelTo(On_Ne_Side_Of_Chasm);
  3153.         }
  3154.         else {
  3155.             Troll.ispaid := nil;
  3156.             Me.travelTo(On_Sw_Side_Of_Chasm);
  3157.         }
  3158.     }
  3159. ;
  3160. Troll: Actor
  3161.     ispaid = nil
  3162.  
  3163.     sdesc = "burly troll"
  3164.     ldesc = {
  3165.         "Trolls are close relatives with rocks and have skin 
  3166.         as tough as that of a rhinoceros.";
  3167.     }
  3168.  
  3169.     actorDesc = {
  3170.         P(); I();
  3171.         "A burly troll stands by the bridge and insists you 
  3172.         throw him a treasure before you may cross.";
  3173.     }
  3174.  
  3175.     noun = 'troll'
  3176.     adjective = 'burly'
  3177.  
  3178.     location = On_Sw_Side_Of_Chasm
  3179.  
  3180.     verDoKick(actor) = {}
  3181.     doKick(actor) = {
  3182.         "The troll laughs alound at your pitiful attempt
  3183.         to injure him.";
  3184.     }
  3185.  
  3186.     verDoAttack(actor) = {
  3187.         "The troll fends off your blows effortlessly.";
  3188.     }
  3189.     verDoAttackWith(actor, io) = {}
  3190.     doAttackWith(actor, io) = {
  3191.         //
  3192.         // If the player throws the axe at the troll,
  3193.         // he just catches it.
  3194.         //
  3195.         if (io = axe)
  3196.             self.ioGiveTo(actor, io);
  3197.         else
  3198.             self.verDoAttack(actor);
  3199.     }
  3200.  
  3201.     verIoGiveTo(actor) = {}
  3202.     ioGiveTo(actor, dobj) = {
  3203.         if (isclass(dobj, CCR_treasure_item)) {
  3204.             "The troll catches your treasure and scurries 
  3205.             away out of sight.";
  3206.  
  3207.             dobj.moveInto(nil);
  3208.             self.ispaid := true;
  3209.         }
  3210.         else if( dobj = tasty_food) {
  3211.             self.doFeed(Me);
  3212.         }
  3213.         else {
  3214.             "The troll deftly catches "; dobj.thedesc;
  3215.             ", examines it carefully, and tosses it back, 
  3216.             declaring, \"Good workmanship, but it's not 
  3217.             valuable enough.\"";
  3218.         }
  3219.     }
  3220.  
  3221.     verIoThrowAt(actor) = { self.verIoGiveTo(actor); }
  3222.     ioThrowAt(actor, dobj) = { self.ioGiveTo(actor, dobj); }
  3223.     verIoThrowTo(actor) = { self.verIoGiveTo(actor); }
  3224.     ioThrowTo(actor, dobj) = { self.ioGiveTo(actor, dobj); }
  3225.  
  3226.     verDoFeed(actor) = {}
  3227.     doFeed(actor) = {
  3228.         if (tasty_food.isIn(Me)) {
  3229.             "Gluttony is not one of the troll's vices. 
  3230.             Avarice, however, is.";
  3231.         }
  3232.         else {
  3233.             "You have nothing the troll wants to eat.";
  3234.         }
  3235.     }
  3236. ;
  3237.  
  3238. In_Sloping_Corridor: CCR_room
  3239.     sdesc = "In Sloping Corridor"
  3240.     ldesc = {
  3241.         I(); "You are in a long winding corridor sloping out 
  3242.         of sight in both directions.";
  3243.     }
  3244.     down = In_Large_Low_Room
  3245.     up = On_Sw_Side_Of_Chasm
  3246. ;
  3247.  
  3248. In_Secret_Canyon: CCR_room
  3249.     enteredfrom = nil
  3250.  
  3251.     sdesc = "In Secret Canyon"
  3252.     ldesc = {
  3253.         I(); "You are in a secret canyon which exits to the 
  3254.         north and east."; P();
  3255.  
  3256.         I();
  3257.         if (Dragon.isIn(self))
  3258.             "A huge green fierce dragon bars the way!";
  3259.         else
  3260.             DragonCorpse.ldesc;
  3261.     }
  3262.     north = {
  3263.         if (self.enteredfrom = In_Secret_N_S_Canyon_0) {
  3264.             return self.enteredfrom;
  3265.         }
  3266.         else {
  3267.             if (self.dragoncheck)
  3268.                 return In_Secret_N_S_Canyon_0;
  3269.             else
  3270.                 return nil;
  3271.         }
  3272.     }
  3273.     east = {
  3274.         if (self.enteredfrom = In_Secret_E_W_Canyon) {
  3275.             return self.enteredfrom;
  3276.         }
  3277.         else {
  3278.             if (self.dragoncheck)
  3279.                 return In_Secret_E_W_Canyon;
  3280.             else
  3281.                 return nil;
  3282.         }
  3283.     }
  3284.  
  3285.     forwards = {
  3286.         if (self.enteredfrom = In_Secret_N_S_Canyon_0)
  3287.             return self.east;
  3288.         else
  3289.             return self.north;
  3290.     }
  3291.     out = {
  3292.         if (self.enteredfrom = In_Secret_N_S_Canyon_0)
  3293.             return self.north;
  3294.         else
  3295.             return self.east;
  3296.     }
  3297.  
  3298.     dragoncheck = {
  3299.         if (Dragon.isIn(self)) {
  3300.             "The dragon looks rather nasty.  You'd best 
  3301.             not try to get by.";
  3302.  
  3303.             return nil;
  3304.         }
  3305.         else
  3306.             return true;
  3307.     }
  3308.  
  3309.     //
  3310.     // Let NPC's by the dragon without incident (they're all on
  3311.     // the same team, after all).
  3312.     //
  3313.     NPCexit1 = In_Secret_N_S_Canyon_0
  3314.     NPCexit2 = In_Secret_E_W_Canyon
  3315. ;
  3316. Dragon: CCR_decoration
  3317.     rhetoricalturn = -999    // hack -- see yesVerb in ccr-verbs.t
  3318.     
  3319.     sdesc = "dragon"
  3320.     ldesc = "I wouldn't mess with it if I were you."
  3321.     location = In_Secret_Canyon
  3322.     noun = 'dragon' 'monster' 'beast' 'lizard'
  3323.     adjective = 'huge' 'green' 'fierce' 'scaly' 'giant' 'ferocious'
  3324.  
  3325.     verDoKick(actor) = {}
  3326.     doKick(actor) = {
  3327.         "Right idea, wrong limb.";
  3328.     }
  3329.  
  3330.     verDoAttack(actor) = {}
  3331.     doAttack(actor) = {
  3332.         "With what?  Your bare hands?";
  3333.         self.rhetoricalturn := global.turnsofar;
  3334.     }
  3335.     verDoAttackWith(actor, io) = {}
  3336.     doAttackWith(actor, io) = {
  3337.         if (io = axe)
  3338.             "The axe bounces harmlessly off the dragon's 
  3339.             thick scales.";
  3340.         else if (io = Hands) {
  3341.             self.kill;
  3342.         }
  3343.         else {
  3344.             "You'd probably be better off using your
  3345.             bare hands than that thing!";
  3346.         }
  3347.     }
  3348.  
  3349.     verIoThrowAt(actor) = { self.verIoGiveTo(actor); }
  3350.     ioThrowAt(actor, dobj) = {
  3351.         if (dobj = axe)
  3352.             self.doAttackWith(actor, dobj);
  3353.         else
  3354.             self.ioGiveTo(actor, dobj);
  3355.     }
  3356.     verIoThrowTo(actor) = { self.verIoGiveTo(actor); }
  3357.     ioThrowTo(actor, dobj) = {
  3358.         if (dobj = axe)
  3359.             self.doAttackWith(actor, dobj);
  3360.         else
  3361.             self.ioGiveTo(actor, dobj);
  3362.     }
  3363.  
  3364.     kill = {
  3365.         "Congratulations!  You have just vanquished a 
  3366.         dragon with your bare hands!  (Unbelievable, 
  3367.         isn't it?)";
  3368.  
  3369.         DragonCorpse.moveInto(self.location);
  3370.         self.moveInto(nil);
  3371.     }
  3372. ;
  3373. DragonCorpse: CCR_decoration
  3374.     sdesc = "dragon"
  3375.     ldesc = {
  3376.         "The body of a huge green dead dragon is lying off to 
  3377.         one side.";
  3378.     }
  3379.     location = nil
  3380.     noun = 'dragon' 'corpse'
  3381.     adjective = 'dead'
  3382.     
  3383.     verDoKick(actor) = { "You've already done enough damage!"; }
  3384.     verDoAttack(actor) = { self.verDoKick(actor); }
  3385.     verDoAttackWith(actor, io) = { self.verDoKick(actor); }
  3386. ;
  3387.  
  3388. On_Ne_Side_Of_Chasm: CCR_room, NoNPC
  3389.     sdesc = "On NE Side of Chasm"
  3390.     ldesc = {
  3391.         I(); "You are on the far side of the chasm.  A 
  3392.         northeast path leads away from the chasm on this 
  3393.         side. ";
  3394.  
  3395.         RicketyBridge.xdesc;
  3396.  
  3397.         if (Troll.location = nil) {
  3398.             P(); I();
  3399.             "The troll is nowhere to be seen.";
  3400.         }
  3401.     }
  3402.     ne = In_Corridor
  3403.  
  3404.     across = { return self.over; }
  3405.     cross = { return self.over; }
  3406.     sw = { return self.over; }
  3407.     over = {
  3408.         RicketyBridge.doCross(Me);
  3409.         return nil;
  3410.     }
  3411.     
  3412.     jump = {
  3413.         if (RicketyBridge.exists) {
  3414.             "I respectfully suggest you go across the 
  3415.             bridge instead of jumping.";
  3416.  
  3417.             return nil;
  3418.         }
  3419.         else
  3420.             return didnt_make_it.death;
  3421.     }
  3422.  
  3423.     fork = At_Fork_In_Path
  3424.     view = At_Breath_Taking_View
  3425.     barren = In_Front_Of_Barren_Room
  3426. ;
  3427.  
  3428. In_Corridor: CCR_room, NoNPC
  3429.     sdesc = "In Corridor"
  3430.     ldesc = {
  3431.         I(); "You're in a long east/west corridor.  A faint 
  3432.         rumbling noise can be heard in the distance.";
  3433.     }
  3434.     west = On_Ne_Side_Of_Chasm
  3435.     east = At_Fork_In_Path
  3436.     fork = At_Fork_In_Path
  3437.     view = At_Breath_Taking_View
  3438.     barren = In_Front_Of_Barren_Room
  3439. ;
  3440.  
  3441. At_Fork_In_Path: CCR_room, NoNPC
  3442.     sdesc = "At Fork in Path"
  3443.     ldesc = {
  3444.         I(); "The path forks here.  The left fork leads 
  3445.         northeast.  A dull rumbling seems to get louder in 
  3446.         that direction.  The right fork leads southeast down 
  3447.         a gentle slope.  The main corridor enters from the 
  3448.         west.";
  3449.     }
  3450.     west = In_Corridor
  3451.     ne = At_Junction_With_Warm_Walls
  3452.     left = At_Junction_With_Warm_Walls
  3453.     se = In_Limestone_Passage
  3454.     right = In_Limestone_Passage
  3455.     down = In_Limestone_Passage
  3456.     view = At_Breath_Taking_View
  3457.     barren = In_Front_Of_Barren_Room
  3458. ;
  3459.  
  3460. At_Junction_With_Warm_Walls: CCR_room, NoNPC
  3461.     sdesc = "At Junction With Warm Walls"
  3462.     ldesc = {
  3463.         I(); "The walls are quite warm here.  From the north 
  3464.         can be heard a steady roar, so loud that the entire 
  3465.         cave seems to be trembling.  Another passage leads 
  3466.         south, and a low crawl goes east.";
  3467.     }
  3468.     south = At_Fork_In_Path
  3469.     fork = At_Fork_In_Path
  3470.     north = At_Breath_Taking_View
  3471.     view = At_Breath_Taking_View
  3472.     east = In_Chamber_Of_Boulders
  3473.     crawl = In_Chamber_Of_Boulders
  3474. ;
  3475.  
  3476. At_Breath_Taking_View: CCR_room, NoNPC
  3477.     sdesc = "At Breath-Taking View"
  3478.     ldesc = {
  3479.         I(); "You are on the edge of a breath-taking view. Far 
  3480.         below you is an active volcano, from which great 
  3481.         gouts of molten lava come surging out, cascading back 
  3482.         down into the depths.  The glowing rock fills the 
  3483.         farthest reaches of the cavern with a blood-red 
  3484.         glare, giving everything an eerie, macabre 
  3485.         appearance. The air is filled with flickering sparks 
  3486.         of ash and a heavy smell of brimstone.  The walls are 
  3487.         hot to the touch, and the thundering of the volcano 
  3488.         drowns out all other sounds.  Embedded in the jagged 
  3489.         roof far overhead are myriad twisted formations 
  3490.         composed of pure white alabaster, which scatter the 
  3491.         murky light into sinister apparitions upon the walls. 
  3492.         To one side is a deep gorge, filled with a bizarre 
  3493.         chaos of tortured rock which seems to have been 
  3494.         crafted by the devil himself.  An immense river of 
  3495.         fire crashes out from the depths of the volcano, 
  3496.         burns its way through the gorge, and plummets into a 
  3497.         bottomless pit far off to your left.  To the right, 
  3498.         an immense geyser of blistering steam erupts 
  3499.         continuously from a barren island in the center of a 
  3500.         sulfurous lake, which bubbles ominously.  The far 
  3501.         right wall is aflame with an incandescence of its 
  3502.         own, which lends an additional infernal splendor to 
  3503.         the already hellish scene.  A dark, forboding passage 
  3504.         exits to the south.";
  3505.     }
  3506.     south = At_Junction_With_Warm_Walls
  3507.     passage = At_Junction_With_Warm_Walls
  3508.     out = At_Junction_With_Warm_Walls
  3509.     fork = At_Fork_In_Path
  3510.     jump = { return self.down; }
  3511.     down = {
  3512.         "Don't be ridiculous!";
  3513.         return nil;
  3514.     }
  3515. ;
  3516. Volcano: decoration
  3517.     sdesc = "active volcano"
  3518.     ldesc = {
  3519.         "Great gouts of molten lava come surging out of the 
  3520.         volvano and go cascading back down into the depths.  
  3521.         The glowing rock fills the farthest reaches of the 
  3522.         cavern with a blood-red glare, giving everything an 
  3523.         eerie, macabre appearance.";
  3524.     }
  3525.     location = At_Breath_Taking_View
  3526.     noun = 'volcano' 'rock'
  3527.     adjective = 'active' 'glowing' 'blood' 'blood-red' 'red' 'eerie'
  3528.         'macabre'
  3529. ;
  3530. Sparks: decoration
  3531.     sdesc = "sparks of ash"
  3532.     adesc = { self.sdesc; }
  3533.     ldesc = {
  3534.         "The sparks too far away for you to get a good look at 
  3535.         them.";
  3536.     }
  3537.     location = At_Breath_Taking_View
  3538.     noun = 'spark' 'sparks' 'ash' 'air'
  3539.     adjective = 'flickering'
  3540. ;
  3541. JaggedRoof: decoration
  3542.     sdesc = "jagged roof"
  3543.     ldesc = {
  3544.         "Embedded in the jagged roof far overhead are myriad 
  3545.         twisted formations composed of pure white alabaster, 
  3546.         which scatter the murky light into sinister 
  3547.         apparitions upon the walls.";
  3548.     }
  3549.     location = At_Breath_Taking_View
  3550.     noun = 'roof' 'formations' 'light' 'apparaitions'
  3551.     adjective = 'jagged' 'twsited' 'murky' 'sinister'
  3552. ;
  3553. DeepGorge: decoration
  3554.     sdesc = "deep gorge"
  3555.     ldesc = {
  3556.         "The gorge is filled with a bizarre chaos of tortured 
  3557.         rock which seems to have been crafted by the devil 
  3558.         himself.";
  3559.     }
  3560.     location = At_Breath_Taking_View
  3561.     noun = 'gorge' 'chaos' 'rock'
  3562.     adjective = 'deep' 'bizarre' 'tortured'
  3563. ;
  3564. RiverOfFire: decoration
  3565.     sdesc = "river of fire"
  3566.     ldesc = {
  3567.         "The river of fire crashes out from the depths of the 
  3568.         volcano, burns its way through the gorge, and 
  3569.         plummets into a bottomless pit far off to your 
  3570.         left.";
  3571.     }
  3572.     location = At_Breath_Taking_View
  3573.     noun = 'river' 'fire' 'depth' 'pit'
  3574.     adjective = 'fire' 'firey' 'bottomless'
  3575. ;
  3576. Geyser: decoration
  3577.     sdesc = "immense geyser"
  3578.     ldesc = {
  3579.         "The geyser of blistering steam erupts continuously 
  3580.         from a barren island in the center of a sulfurous 
  3581.         lake, which bubbles ominously.";
  3582.     }
  3583.     location = At_Breath_Taking_View
  3584.     noun = 'geyser' 'steam' 'island' 'lake'
  3585.     adjective = 'immense' 'blistering' 'barren' 'sulfrous'
  3586.         'sulferous' 'sulpherous' 'sulphrous' 'bubbling'
  3587. ;
  3588.  
  3589. In_Chamber_Of_Boulders: CCR_room, NoNPC
  3590.     sdesc = "In Chamber of Boulders"
  3591.     ldesc = {
  3592.         I(); "You are in a small chamber filled with large 
  3593.         boulders.  The walls are very warm, causing the air 
  3594.         in the room to be almost stifling from the heat.  The 
  3595.         only exit is a crawl heading west, through which is 
  3596.         coming a low rumbling.";
  3597.     }
  3598.     west = At_Junction_With_Warm_Walls
  3599.     out = At_Junction_With_Warm_Walls
  3600.     crawl = At_Junction_With_Warm_Walls
  3601.     fork = At_Fork_In_Path
  3602.     view = At_Breath_Taking_View
  3603. ;
  3604. ChamberBoulders: CCR_decoration
  3605.     sdesc = "boulders"
  3606.     ldesc = "They're just ordinary boulders.  They're warm."
  3607.     noun = 'boulder' 'boulders' 'rocks' 'stones'
  3608.     location = In_Chamber_Of_Boulders
  3609. ;
  3610.  
  3611. In_Limestone_Passage: CCR_room, NoNPC
  3612.     sdesc = "In Limestone Passage"
  3613.     ldesc = {
  3614.         I(); "You are walking along a gently sloping 
  3615.         north/south passage lined with oddly shaped limestone 
  3616.         formations.";
  3617.     }
  3618.     north = At_Fork_In_Path
  3619.     up = At_Fork_In_Path
  3620.     fork = At_Fork_In_Path
  3621.     south = In_Front_Of_Barren_Room
  3622.     down = In_Front_Of_Barren_Room
  3623.     barren = In_Front_Of_Barren_Room
  3624.     view = At_Breath_Taking_View
  3625. ;
  3626. LimestoneFormations: decoration
  3627.     sdesc = "limestone formations"
  3628.     ldesc = {
  3629.         "Every now and then a particularly strange shape
  3630.         catches your eye.";
  3631.     }
  3632.     location = In_Limestone_Passage
  3633.     noun = 'formations' 'shape' 'shapes'
  3634.     adjective = 'lime' 'limestone' 'stone' 'oddly' 'shaped'
  3635.         'oddly-shaped'
  3636. ;
  3637.  
  3638.  
  3639. In_Front_Of_Barren_Room: CCR_room, NoNPC
  3640.     sdesc = "In Front of Barren Room"
  3641.     ldesc = {
  3642.         I(); "You are standing at the entrance to a large, 
  3643.         barren room.  A sign posted above the entrance reads: 
  3644.         \"Caution!  Bear in room!\"";
  3645.     }
  3646.     west = In_Limestone_Passage
  3647.     up = In_Limestone_Passage
  3648.     fork = At_Fork_In_Path
  3649.     east = In_Barren_Room
  3650.     in = In_Barren_Room
  3651.     barren = In_Barren_Room
  3652.     enter = In_Barren_Room
  3653.     view = At_Breath_Taking_View
  3654. ;
  3655. BarrenSign: CCR_decoration, readable
  3656.     sdesc = "sign"
  3657.     ldesc = { self.readdesc; }
  3658.     readdesc = {
  3659.         "The sign reads, \"Caution!  Bear in room!\"";
  3660.     }
  3661.  
  3662.     noun = 'sign'
  3663.     adjective = 'barren' 'room'
  3664.  
  3665.     location = In_Front_Of_Barren_Room
  3666. ;
  3667.  
  3668. In_Barren_Room: CCR_room, NoNPC
  3669.     sdesc = "In Barren Room"
  3670.     ldesc = {
  3671.         I(); "You are inside a barren room.  The center of 
  3672.         the room is completely empty except for some dust.  
  3673.         Marks in the dust lead away toward the far end of the 
  3674.         room.  The only exit is the way you came in.";
  3675.     }
  3676.     west = In_Front_Of_Barren_Room
  3677.     out = In_Front_Of_Barren_Room
  3678.     fork = At_Fork_In_Path
  3679.     view = At_Breath_Taking_View
  3680. ;
  3681. Dust: CCR_decoration
  3682.     sdesc = "dust"
  3683.     ldesc = { "It just looks like ordinary dust."; }
  3684.     location = In_Barren_Room
  3685.     noun = 'dust' 'marks'
  3686. ;
  3687. Bear: Actor
  3688.     rhetoricalturn = -999    // hack -- see yesVerb in ccr-verbs.t
  3689.  
  3690.     exists = true
  3691.  
  3692.     istame = nil        // has the bear been fed?
  3693.     isfollowing = nil    // is the bear following the player?
  3694.     wasreleased = nil    // has the bear been unchained yet?
  3695.  
  3696.     sdesc = "large bear"
  3697.     ldesc = {
  3698.         "The bear is extremely large, ";
  3699.  
  3700.         if (self.istame)
  3701.             "but appears to be friendly.";
  3702.         else
  3703.             "and seems quite ferocious!";
  3704.     }
  3705.  
  3706.     //
  3707.     // Can't use actorDesc because we our location is a method,
  3708.     // so we're not ever really contained in a room.  We've
  3709.     // hacked adv.t to make this work by checking the bear
  3710.     // explicitly.
  3711.     //
  3712.     actorDesc = {
  3713.         if (self.isIn(Me.location)) {
  3714.             P(); I();
  3715.  
  3716.             if (self.isfollowing) {
  3717.                 "You are being followed by a very 
  3718.                 large, tame bear.";
  3719.             }
  3720.             else if (self.istame) {
  3721.                 if (not self.wasreleased and
  3722.                 self.isIn(In_Barren_Room)) {
  3723.  
  3724.                     "There is a gentle cave bear 
  3725.                     sitting placidly in one 
  3726.                     corner.";
  3727.                 }
  3728.                 else
  3729.                     "There is a contented-looking 
  3730.                     bear wandering about 
  3731.                     nearby.";
  3732.             }
  3733.             else {
  3734.                 "There is a ferocious cave bear 
  3735.                 eyeing you from the far end of the 
  3736.                 room!";
  3737.             }
  3738.         }
  3739.     }
  3740.  
  3741.     noun = 'bear'
  3742.     adjective = 'large' 'tame' 'ferocious' 'cave'
  3743.  
  3744.     locationOK = true    // tell compiler OK for location to be method
  3745.     location = {
  3746.         if (self.exists) {
  3747.             if (self.isfollowing)
  3748.                 return Me.location;
  3749.             else
  3750.                 return In_Barren_Room;
  3751.         }
  3752.         else
  3753.             return nil;
  3754.     }
  3755.  
  3756.     verDoKick(actor) =  {
  3757.         if (self.istame)
  3758.             self.onlyfriend;
  3759.         else
  3760.             "You obviously have not fully grasped the 
  3761.             gravity of the situation.  Do get a grip on 
  3762.             yourself.";
  3763.     }
  3764.     verDoAttack(actor) = {
  3765.         if (self.istame)
  3766.             self.onlyfriend;
  3767.         else if (not axe.isIn(Me))
  3768.             self.bearhands;
  3769.     }
  3770.     doAttack(actor) = { self.doAttackWith(actor, axe); }
  3771.  
  3772.     verDoAttackWith(actor, io) = {
  3773.         if (self.istame)
  3774.             self.onlyfriend;
  3775.     }
  3776.     doAttackWith(actor, io) = {
  3777.         //
  3778.         // If the player throws the axe at the bear, the
  3779.         // axe misses and becomes inaccessible.  (Doh!)
  3780.         //
  3781.         if (io = axe) {
  3782.             "The axe misses and lands near the bear where 
  3783.             you can't get at it.";
  3784.  
  3785.             axe.moveInto(self.location);
  3786.             axe.nograb := true;        // little hack
  3787.         }
  3788.         else if (io = Hands)
  3789.             self.nicetry;
  3790.         else
  3791.             self.verDoAttack(actor);
  3792.     }
  3793.  
  3794.     onlyfriend = {
  3795.         "The bear is confused; he only wants to be your 
  3796.         friend.";
  3797.     }
  3798.     bearhands = {
  3799.         "With what?  Your bare hands?  Against *his* bear 
  3800.         hands??";
  3801.  
  3802.         self.rhetoricalturn := global.turnsofar;
  3803.     }
  3804.     nicetry = {
  3805.         "Nice try, but sorry.";
  3806.     }
  3807.     
  3808.     verIoGiveTo(actor) = {}
  3809.     ioGiveTo(actor, dobj) = {
  3810.         if (dobj = tasty_food) {
  3811.             self.doFeed(Me);
  3812.         }
  3813.         else {
  3814.             if (self.istame)
  3815.                 "The bear doesn't seem very 
  3816.                 interested in your offer.";
  3817.             else
  3818.                 "Uh-oh -- your offer only makes the bear 
  3819.                 angrier!";
  3820.         }
  3821.     }
  3822.  
  3823.     verIoThrowAt(actor) = { self.verIoGiveTo(actor); }
  3824.     ioThrowAt(actor, dobj) = {
  3825.         if (dobj = axe)
  3826.             self.doAttackWith(actor, dobj);
  3827.         else
  3828.             self.ioGiveTo(actor, dobj);
  3829.     }
  3830.     verIoThrowTo(actor) = { self.verIoGiveTo(actor); }
  3831.     ioThrowTo(actor, dobj) = {
  3832.         if (dobj = axe)
  3833.             self.doAttackWith(actor, dobj);
  3834.         else
  3835.             self.ioGiveTo(actor, dobj);
  3836.     }
  3837.  
  3838.     verDoFeed(actor) = {}
  3839.     doFeed(actor) = {
  3840.         if (tasty_food.isIn(Me)) {
  3841.             "The bear eagerly wolfs down your food, after 
  3842.             which he seems to calm down considerably and 
  3843.             even becomes rather friendly.";
  3844.  
  3845.             tasty_food.moveInto(nil);
  3846.             self.istame := true;
  3847.             axe.nograb := nil;
  3848.         }
  3849.         else if (self.istame) {
  3850.             "You have nothing left to give the bear.";
  3851.         }
  3852.         else {
  3853.             "The bear seems more likely to eat *you*
  3854.             than anything you've got on you!";
  3855.         }
  3856.     }
  3857.  
  3858.     verDoDrop(actor) = {
  3859.         if (not self.isfollowing)
  3860.             "The bear isn't following you.";
  3861.     }
  3862.     doDrop(actor) = {
  3863.         if (Troll.isIn(Me.location)) {
  3864.             "The bear lumbers toward the troll, who lets 
  3865.             out a startled shriek and scurries away.  The 
  3866.             bear soon gives up the pursuit and wanders 
  3867.             back.";
  3868.  
  3869.             Troll.moveInto(nil);
  3870.             self.isfollowing := nil;
  3871.         }
  3872.         else {
  3873.             "The bear wanders away from you.";
  3874.         }
  3875.     }
  3876.  
  3877.     verDoTake(actor) = {
  3878.         if (not self.istame)
  3879.             "Surely you're joking!";
  3880.         else if (not self.wasreleased)
  3881.             "The bear is still chained to the wall.";
  3882.     }
  3883.     doTake(actor) = {
  3884.         self.isfollowing := true;
  3885.         "Ok, the bear's now following you around.";
  3886.     }
  3887. ;
  3888.  
  3889. Different_Maze_3: CCR_room
  3890.     sdesc = "Maze of Twisting Little Passage, All Different"
  3891.     ldesc = {
  3892.         I(); "You are in a maze of twisting little passages, 
  3893.         all different.";
  3894.     }
  3895.     west = Different_Maze_1
  3896.     se = Different_Maze_4
  3897.     nw = Different_Maze_5
  3898.     sw = Different_Maze_6
  3899.     ne = Different_Maze_7
  3900.     up = Different_Maze_8
  3901.     down = Different_Maze_9
  3902.     north = Different_Maze_10
  3903.     south = Different_Maze_11
  3904.     east = Different_Maze_2
  3905. ;
  3906.  
  3907. Different_Maze_4: CCR_room
  3908.     sdesc = "Little Maze of Twisty Passages, All Different"
  3909.     ldesc = {
  3910.         I(); "You are in a little maze of twisty passages, 
  3911.         all different.";
  3912.     }
  3913.     nw = Different_Maze_1
  3914.     up = Different_Maze_3
  3915.     north = Different_Maze_5
  3916.     south = Different_Maze_6
  3917.     west = Different_Maze_7
  3918.     sw = Different_Maze_8
  3919.     ne = Different_Maze_9
  3920.     east = Different_Maze_10
  3921.     down = Different_Maze_11
  3922.     se = Different_Maze_2
  3923. ;
  3924.  
  3925. Different_Maze_5: CCR_room
  3926.     sdesc = "Twisting Maze of Little Passages, All Different"
  3927.     ldesc = {
  3928.         I(); "You are in a twisting maze of little passages, 
  3929.         all different.";
  3930.     }
  3931.     up = Different_Maze_1
  3932.     down = Different_Maze_3
  3933.     west = Different_Maze_4
  3934.     ne = Different_Maze_6
  3935.     sw = Different_Maze_7
  3936.     east = Different_Maze_8
  3937.     north = Different_Maze_9
  3938.     nw = Different_Maze_10
  3939.     se = Different_Maze_11
  3940.     south = Different_Maze_2
  3941. ;
  3942.  
  3943. Different_Maze_6: CCR_room
  3944.     sdesc = "Twisting Little Maze of Passages, All Different"
  3945.     ldesc = {
  3946.         I(); "You are in a twisting little maze of passages, 
  3947.         all different.";
  3948.     }
  3949.     ne = Different_Maze_1
  3950.     north = Different_Maze_3
  3951.     nw = Different_Maze_4
  3952.     se = Different_Maze_5
  3953.     east = Different_Maze_7
  3954.     down = Different_Maze_8
  3955.     south = Different_Maze_9
  3956.     up = Different_Maze_10
  3957.     west = Different_Maze_11
  3958.     sw = Different_Maze_2
  3959. ;
  3960.  
  3961. Different_Maze_7: CCR_room
  3962.     sdesc = "Twisty Little Maze of Passages, All Different"
  3963.     ldesc = {
  3964.         I(); "You are in a twisty little maze of passages, 
  3965.         all different.";
  3966.     }
  3967.     north = Different_Maze_1
  3968.     se = Different_Maze_3
  3969.     down = Different_Maze_4
  3970.     south = Different_Maze_5
  3971.     east = Different_Maze_6
  3972.     west = Different_Maze_8
  3973.     sw = Different_Maze_9
  3974.     ne = Different_Maze_10
  3975.     nw = Different_Maze_11
  3976.     up = Different_Maze_2
  3977. ;
  3978.  
  3979. Different_Maze_8: CCR_room
  3980.     sdesc = "Twisty Maze of Little Passages, All Different"
  3981.     ldesc = {
  3982.         I(); "You are in a twisty maze of little passages, 
  3983.         all different.";
  3984.     }
  3985.     east = Different_Maze_1
  3986.     west = Different_Maze_3
  3987.     up = Different_Maze_4
  3988.     sw = Different_Maze_5
  3989.     down = Different_Maze_6
  3990.     south = Different_Maze_7
  3991.     nw = Different_Maze_9
  3992.     se = Different_Maze_10
  3993.     ne = Different_Maze_11
  3994.     north = Different_Maze_2
  3995. ;
  3996.  
  3997. Different_Maze_9: CCR_room
  3998.     sdesc = "Little Twisty Maze of Passages, All Different"
  3999.     ldesc = {
  4000.         I(); "You are in a little twisty maze of passages, 
  4001.         all different.";
  4002.     }
  4003.     se = Different_Maze_1
  4004.     ne = Different_Maze_3
  4005.     south = Different_Maze_4
  4006.     down = Different_Maze_5
  4007.     up = Different_Maze_6
  4008.     nw = Different_Maze_7
  4009.     north = Different_Maze_8
  4010.     sw = Different_Maze_10
  4011.     east = Different_Maze_11
  4012.     west = Different_Maze_2
  4013. ;
  4014.  
  4015. Different_Maze_10: CCR_room
  4016.     sdesc = "Maze of Little Twisting Passages, All Different"
  4017.     ldesc = {
  4018.         I(); "You are in a maze of little twisting passages, 
  4019.         all different.";
  4020.     }
  4021.     down = Different_Maze_1
  4022.     east = Different_Maze_3
  4023.     ne = Different_Maze_4
  4024.     up = Different_Maze_5
  4025.     west = Different_Maze_6
  4026.     north = Different_Maze_7
  4027.     south = Different_Maze_8
  4028.     se = Different_Maze_9
  4029.     sw = Different_Maze_11
  4030.     nw = Different_Maze_2
  4031. ;
  4032.  
  4033. Different_Maze_11: CCR_room
  4034.     sdesc = "Maze of Little Twisty Passages, All Different"
  4035.     ldesc = {
  4036.         I(); "You are in a maze of little twisty passages, 
  4037.         all different.";
  4038.     }
  4039.     sw = Different_Maze_1
  4040.     nw = Different_Maze_3
  4041.     east = Different_Maze_4
  4042.     west = Different_Maze_5
  4043.     north = Different_Maze_6
  4044.     down = Different_Maze_7
  4045.     se = Different_Maze_8
  4046.     up = Different_Maze_9
  4047.     south = Different_Maze_10
  4048.     ne = Different_Maze_2
  4049. ;
  4050.  
  4051. /*
  4052.  * We don't allow NPC's here because it would be *really* bogus
  4053.  * if the pirate stole the batteries right after the player bought
  4054.  * them.
  4055.  */
  4056. Dead_End_14: CCR_dead_end_room, NoNPC
  4057.     sdesc = "At a Dead End, in Front of a Massive Vending Machine"
  4058.     ldesc = {
  4059.         I(); "You have reached a dead end. There is a massive 
  4060.         vending machine here.";
  4061.  
  4062.         if (PirateMessage.isIn(self)) {
  4063.             P();
  4064.             I(); "Hmmm...  There is a message here 
  4065.             scrawled in the dust in a flowery script.";
  4066.         }
  4067.     }
  4068.  
  4069.     north = Different_Maze_2
  4070.     out = Different_Maze_2
  4071. ;
  4072. VendingMachine: CCR_decoration, readable
  4073.     sdesc = "vending machine"
  4074.     ldesc = { self.readdesc; }
  4075.     readdesc = {
  4076.         "The instructions on the vending machine read, 
  4077.         \"Insert coins to receive fresh batteries.\"";
  4078.     }
  4079.     location = Dead_End_14
  4080.     noun = 'machine' 'slot'
  4081.     adjective = 'vending' 'massive' 'battery' 'coin'
  4082.  
  4083.     verIoPutIn(actor) = {}
  4084.     ioPutIn(actor, dobj) = {
  4085.         if (dobj = rare_coins) {
  4086.             "Soon after you insert the coins in the coin 
  4087.             slot, the vending machines makes a griding 
  4088.             sound, and a set of fresh batteries falls at 
  4089.             your feet.";
  4090.  
  4091.             dobj.moveInto(nil);
  4092.             fresh_batteries.moveInto(self.location);
  4093.         }
  4094.         else {
  4095.             "The machine seems to be designed to take 
  4096.             coins.";
  4097.         }
  4098.     }
  4099.  
  4100.     verDoKick(actor) = {}
  4101.     doKick(actor) = {
  4102.         "<WHUMP!> You boot the machine, but to no avail.";
  4103.     }
  4104.     verDoBreak(actor) = {}
  4105.     doBreak(actor) = {
  4106.         "The machine is quite stury and survives your attack
  4107.         without getting so much as a scratch.";
  4108.     }
  4109.     verDoAttack(actor) = { self.verDoBreak(actor); }
  4110.     doAttack(actor) = { self.doBreak(actor); }
  4111.     verDoAttackWith(actor, io) = { self.verDoAttack(actor); }
  4112.     doAttackWith(actor) = { self.doAttack(actor); }
  4113.  
  4114.     verDoLookbehind(actor) = {
  4115.         "You don't find anything behind the vending machine.";
  4116.     }
  4117.     verDoLookunder(actor) = {
  4118.         "You don't find anything behind the under machine.";
  4119.     }
  4120.     verDoMove(actor) = { "The vending machine is far too heavy to move."; }
  4121. ;
  4122. PirateMessage: CCR_decoration, readable
  4123.     sdesc = "message in the dust"
  4124.     ldesc = {
  4125.         "The message reads, \"This is not the maze where the 
  4126.         pirate leaves his treasure chest.\"";
  4127.     }
  4128.     noun = 'message' 'scrawl' 'writing' 'script'
  4129.     adjective = 'scrawled' 'flowery'
  4130.     location = nil    // moved to Dead_End_14 when pirate spotted
  4131. ;
  4132.  
  4133. /*
  4134.  * Endgame locations
  4135.  *
  4136.  * We make these NoNPC rooms so that dwarves and pirate don't get
  4137.  * teleported here when (if) they get stuck trying to move around
  4138.  * the cave.  (The dwarves in here aren't real actors because they
  4139.  * kill the player immediately if they're awake.)
  4140.  */
  4141. At_Ne_End: CCR_room, lightroom, NoNPC
  4142.     sdesc = "At NE End"
  4143.     ldesc = {
  4144.         I(); "You are at the northeast end of an immense 
  4145.         room, even larger than the giant room.  It appears to 
  4146.         be a repository for the \"Adventure\" program.  
  4147.         Massive torches far overhead bathe the room with 
  4148.         smoky yellow light.  Scattered about you can be seen 
  4149.         a pile of bottles (all of them empty), a nursery of 
  4150.         young beanstalks murmuring quietly, a bed of oysters, 
  4151.         a bundle of black rods with rusty stars on their 
  4152.         ends, and a collection of brass lanterns.  Off to one 
  4153.         side a great many dwarves are sleeping on the floor, 
  4154.         snoring loudly.  A sign nearby reads: \"Do not 
  4155.         disturb the dwarves!\""; P();
  4156.  
  4157.         I(); "An immense mirror is hanging against one wall, 
  4158.         and stretches to the other end of the room, where 
  4159.         various other sundry objects can be glimpsed dimly in 
  4160.         the distance.";
  4161.     }
  4162.     sw = At_Sw_End
  4163. ;
  4164. Mirror_2: CCR_decoration
  4165.     sdesc = "enormous mirror"
  4166.     ldesc = "It looks like an ordinary, albeit enormous, mirror."
  4167.     noun = 'mirror'
  4168.     adjective = 'enormous' 'huge' 'big' 'large' 'suspended'
  4169.         'hanging' 'vanity' 'dwarvish'
  4170.  
  4171.     locationOK = true    // OK for location to be method
  4172.     location = {
  4173.         if (Me.isIn(At_Ne_End))
  4174.             return At_Ne_End;
  4175.         else
  4176.             return At_Sw_End;
  4177.     }
  4178.  
  4179.     verDoBreak(actor) = {}
  4180.     doBreak(actor) = {
  4181.         "You strike the mirror a resounding blow, whereupon 
  4182.         it shatters into a myriad tiny fragments.";
  4183.  
  4184.         //
  4185.         // A very bad move...
  4186.         //
  4187.         end_dwarves();
  4188.     }
  4189.     verDoAttack(actor) = { self.verDoBreak(actor); }
  4190.     doAttack(actor) = { self.doBreak(actor); }
  4191.     verDoAttackWith(actor, io) = { self.verDoAttack(actor); }
  4192.     doAttackWith(actor) = { self.doAttack(actor); }
  4193.     verDoKick(actor) = { self.verDoBreak(actor); }
  4194.     doKick(actor) = { self.doBreak(actor); }
  4195. ;
  4196. RepositoryStuff_1: CCR_decoration
  4197.     sdesc = "collection of adventure game materials"
  4198.     ldesc = {
  4199.         "You've seen everything in here already, albeit
  4200.         in somewhat different contexts.";
  4201.     }
  4202.     location = At_Ne_End
  4203.     noun = 'stuff' 'junk' 'materials' 'torches' 'objects'
  4204.     adjective = 'adventure' 'repository' 'massive' 'sundry'
  4205.  
  4206.     verifyRemove(actor) = {
  4207.         "Realizing that by removing the loot here you'd be 
  4208.         ruining the game for future players, you leave the 
  4209.         \"Adventure\" materials where they are.";
  4210.     }
  4211. ;
  4212. RepositoryDwarves: CCR_decoration
  4213.     sdesc = "sleeping dwarves"
  4214.     adesc = { self.sdesc; }
  4215.     ldesc = {
  4216.         "I wouldn't bother the dwarves if I were you.";
  4217.     }
  4218.     location = At_Ne_End
  4219.     noun = 'dwarf' 'dwarves'
  4220.     adjective = 'sleeping' 'snoring' 'dozing' 'snoozing'
  4221.  
  4222.     verDoWake(actor) = {}
  4223.     doWake(actor) = {
  4224.         "You prod the nearest dwarf, who wakes up grumpily, 
  4225.         takes one look at you, curses, and grabs for his 
  4226.         axe.";
  4227.  
  4228.         end_dwarves();
  4229.     }
  4230.     verDoAttack(actor) = {}
  4231.     doAttack(actor) = { self.doWake(actor); }
  4232.     verDoKick(actor) = {}
  4233.     doKick(actor) = { self.doWake(actor); }
  4234. ;
  4235. RepositoryPlant: CCR_decoration
  4236.     location = At_Ne_End
  4237. ;
  4238.  
  4239. At_Sw_End: CCR_room, lightroom, NoNPC
  4240.     sdesc = "At SW End"
  4241.     ldesc = {
  4242.         I(); "You are at the southwest end of the repository. 
  4243.         To one side is a pit full of fierce green snakes. On 
  4244.         the other side is a row of small wicker cages, each 
  4245.         of which contains a little sulking bird.  In one 
  4246.         corner is a bundle of black rods with rusty marks on 
  4247.         their ends.  A large number of velvet pillows are 
  4248.         scattered about on the floor. A vast mirror stretches 
  4249.         off to the northeast. At your feet is a large steel 
  4250.         grate, next to which is a sign which reads, 
  4251.         \"TREASURE VAULT. Keys in main office.\"";
  4252.     }
  4253.     ne = At_Ne_End
  4254.     down = {
  4255.         RepositoryGrate.doEnter(Me);
  4256.         return nil;
  4257.     }
  4258. ;
  4259. RepositoryGrate: fixeditem, keyedLockable
  4260.     isopen = nil
  4261.     islocked = true
  4262.     sdesc = "steel grate"
  4263.     ldesc = {
  4264.         "It just looks like an ordinary steel grate.";
  4265.  
  4266.         " It is ";
  4267.         if (self.isopen)
  4268.             "open.";
  4269.         else if (self.islocked) 
  4270.             "closed and locked.";
  4271.         else 
  4272.             "closed.";
  4273.     }
  4274.     noun = 'grate' 'lock' 'gate' 'grille'
  4275.     adjective = 'metal' 'strong' 'steel' 'open' 'closed' 'locked'
  4276.         'unlocked'
  4277.  
  4278.     location = At_Sw_End
  4279.  
  4280.     mykey = nil    // no key for this one
  4281.  
  4282.     verDoEnter(actor) = {}
  4283.     doEnter(actor) = {
  4284.         if (not Grate.islocked) {
  4285.             if (not Grate.isopen) {
  4286.                 "(Opening the grate first.)\b";
  4287.                 Grate.isopen := true;
  4288.                         
  4289.             }
  4290.             if (actor.isIn(Outside_Grate))
  4291.                 actor.travelTo(Below_The_Grate);
  4292.             else
  4293.                 actor.travelTo(Outside_Grate);
  4294.         }
  4295.         else {
  4296.             "You can't go through a locked steel grate!";
  4297.         }
  4298.     }
  4299.     
  4300.     verIoPutIn(actor) = { "You can't put anything in that! "; }
  4301.     verDoPick = { "You have no tools to pick the lock with."; }
  4302. ;
  4303.  
  4304. RepositoryStuff_2: CCR_decoration
  4305.     sdesc = "collection of adventure game materials"
  4306.     ldesc = {
  4307.         "You've seen everything in here already, albeit
  4308.         in somewhat different contexts.";
  4309.     }
  4310.     location = At_Sw_End
  4311.  
  4312.     verifyRemove(actor) = {
  4313.         "Realizing that by removing the loot here you'd be 
  4314.         ruining the game for future players, you leave the 
  4315.         \"Adventure\" meterials where they are.";
  4316.     }
  4317.  
  4318.     noun = 'pit' 'snake' 'snakes' 
  4319.     adjective = 'fierce' 'green'
  4320. ;
  4321.  
  4322. /*
  4323.  * Miscellaneous messages
  4324.  */
  4325. broken_neck: object
  4326.     death = {
  4327.         "You are at the bottom of the pit with a broken neck.";
  4328.         die();
  4329.         return nil;
  4330.     }
  4331. ;
  4332. didnt_make_it: object
  4333.     death = {
  4334.         "You didn't make it.";
  4335.         die();
  4336.         return nil;
  4337.     }
  4338. ;
  4339. crawled_around: object
  4340.     message = {
  4341.         "You have crawled around in some little holes and 
  4342.         wound up back in the main passage.";
  4343.  
  4344.         return nil;
  4345.     }
  4346. ;
  4347. wontfit: object
  4348.     message = {
  4349.         "Something you're carrying won't fit through the 
  4350.         tunnel with you. You'd best take inventory and drop 
  4351.         something.";
  4352.  
  4353.         return nil;
  4354.     }
  4355. ;
  4356.  
  4357. /*
  4358.  * Room feature decorations.
  4359.  * These don't give any new information, but they make the program
  4360.  * seem less brain-damaged.
  4361.  */
  4362. TheRoom: CCR_decoration
  4363.     sdesc = "room"
  4364.     ldesc = {
  4365.         // Upon "examine room" we just give the standard
  4366.         // description for the current location.
  4367.         Me.location.lookAround(true);
  4368.     }
  4369.     noun = 'room' 'anteroom' 'dark-room' 'darkroom'
  4370.     adjective = 'debris' 'low' 'twopit' 'large' 'lighted' 'slab'
  4371.         'giant' 'soft' 'oriental' 'dark' 'immense' 'barren'
  4372.         'bear-in' 'bearin'
  4373.     locationOK = true     // tell compiler OK for location to be method
  4374.     location = {
  4375.         return Me.location;    // always where player is
  4376.     }
  4377. ;
  4378. Hands: CCR_decoration    // the player's hands
  4379.     sdesc = "your hands"
  4380.     adesc = { self.sdesc; }
  4381.     thedesc = { self.sdesc; }
  4382.  
  4383.     ldesc = "The look pretty normal to me."
  4384.  
  4385.     noun = 'hands'
  4386.     adjective = 'my' 'bare' 'hands'
  4387.  
  4388.     locationOK = true     // tell compiler OK for location to be method
  4389.     location = {
  4390.         return Me.location;    // always where player is
  4391.     }
  4392. ;
  4393.  
  4394. class rfd: floatingdecoration
  4395.     ldesc = "You know as much as I do at this point."
  4396. ;
  4397. Crawl: rfd
  4398.     sdesc = "crawl"
  4399.     noun = 'crawl' 'crawls'
  4400.     adjective = 'cobble' 'low' 'wide' 'higher' 'dead' 'end' 'tight'
  4401.     loclist = [
  4402.         Below_The_Grate  In_Cobble_Crawl  In_Debris_Room
  4403.         In_Dirty_Passage  On_Brink_Of_Pit
  4404.         At_West_End_Of_Hall_Of_Mists  At_East_End_Of_Long_Hall
  4405.         At_Complex_Junction  In_Large_Low_Room  Dead_End_Crawl
  4406.         In_Tall_E_W_Canyon  In_Oriental_Room
  4407.         At_Junction_With_Warm_Walls  In_Chamber_Of_Boulders
  4408.     ]
  4409. ;
  4410. Chamber: rfd
  4411.     sdesc = "chamber"
  4412.     noun = 'chamber'
  4413.     adjective = 'small' 'splendid' 'south' 'side' 'west' 'large'
  4414.             'low' 'circular'
  4415.     loclist = [
  4416.         Below_The_Grate  In_Bird_Chamber  In_South_Side_Chamber
  4417.         In_West_Side_Chamber  In_Slab_Room  In_Plover_Room
  4418.         In_Chamber_Of_Boulders
  4419.     ]
  4420. ;
  4421. Passage: rfd
  4422.     sdesc = "passage"
  4423.     noun = 'passage' 'opening' 'openings' 'corridor' 'corridors'
  4424.         'path' 'paths'
  4425.     adjective = 'low' 'wide' 'plugged' 'good' 'east' 'small' 'twisty'
  4426.         'little' 'n/s' 'e/w' 'dirty' 'broken' 'high' 'long'
  4427.         'large' 'walking' 'sizeable' 'sizable' 'cavernous'
  4428.         'blocked' 'immense' 'gently' 'sloping' 'coral'
  4429.         'shallow' 'somewhat' 'steeper' 'dark' 'forboding'
  4430.     loclist = [
  4431.         In_Cobble_Crawl In_Debris_Room 
  4432.         In_Awkward_Sloping_E_W_Canyon In_Bird_Chamber 
  4433.         At_Top_Of_Small_Pit In_Hall_Of_Mists 
  4434.         On_East_Bank_Of_Fissure In_Nugget_Of_Gold_Room 
  4435.         In_Hall_Of_Mt_King At_West_End_Of_Twopit_Room 
  4436.         In_East_Pit In_West_Pit West_Side_Of_Fissure 
  4437.         Low_N_S_Passage In_South_Side_Chamber 
  4438.         In_West_Side_Chamber At_Y2 Jumble_Of_Rock 
  4439.         At_Window_On_Pit_1 In_Dirty_Passage On_Brink_Of_Pit 
  4440.         In_Pit In_Dusty_Rock_Room 
  4441.         At_West_End_Of_Hall_Of_Mists Alike_Maze_1 
  4442.         Alike_Maze_2 Alike_Maze_3 Alike_Maze_4 Dead_End_1 
  4443.         Dead_End_2 Dead_End_3 Alike_Maze_5 Alike_Maze_6 
  4444.         Alike_Maze_7 Alike_Maze_8 Alike_Maze_9 Dead_End_4 
  4445.         Alike_Maze_10 Dead_End_5 At_Brink_Of_Pit Dead_End_6 
  4446.         At_East_End_Of_Long_Hall At_West_End_Of_Long_Hall 
  4447.         Crossover Dead_End_7 At_Complex_Junction In_Bedquilt 
  4448.         In_Swiss_Cheese_Room At_East_End_Of_Twopit_Room 
  4449.         In_Slab_Room In_Secret_N_S_Canyon_0 
  4450.         In_Secret_N_S_Canyon_1 
  4451.         At_Junction_Of_Three_Secret_Canyons In_Large_Low_Room 
  4452.         Dead_End_Crawl 
  4453.         In_Secret_E_W_Canyon In_N_S_Canyon 
  4454.         Canyon_Dead_End In_Tall_E_W_Canyon Dead_End_8 
  4455.         Alike_Maze_11 Dead_End_9 Dead_End_10 Alike_Maze_12 
  4456.         Alike_Maze_13 Dead_End_11 Dead_End_12 Alike_Maze_14 
  4457.         In_Narrow_Corridor At_Steep_Incline_Above_Large_Room 
  4458.         In_Giant_Room At_Recent_Cave_In 
  4459.         In_Immense_N_S_Passage In_Cavern_With_Waterfall 
  4460.         In_Soft_Room In_Oriental_Room In_Misty_Cavern 
  4461.         In_Alcove In_Plover_Room In_Dark_Room In_Arched_Hall 
  4462.         In_Shell_Room In_Ragged_Corridor In_A_Cul_De_Sac 
  4463.         In_Anteroom Different_Maze_1 At_Witts_End 
  4464.         In_Mirror_Canyon At_Window_On_Pit_2 Atop_Stalactite 
  4465.         Different_Maze_2 At_Reservoir Dead_End_13 At_Ne_End 
  4466.         At_Sw_End On_Sw_Side_Of_Chasm In_Sloping_Corridor 
  4467.         In_Secret_Canyon  On_Ne_Side_Of_Chasm In_Corridor 
  4468.         At_Fork_In_Path At_Junction_With_Warm_Walls 
  4469.         At_Breath_Taking_View In_Chamber_Of_Boulders 
  4470.         In_Limestone_Passage In_Front_Of_Barren_Room 
  4471.         In_Barren_Room Different_Maze_3 Different_Maze_4 
  4472.         Different_Maze_5 Different_Maze_6 Different_Maze_7 
  4473.         Different_Maze_8 Different_Maze_9 Different_Maze_10 
  4474.         Different_Maze_11 Dead_End_14
  4475.     ]
  4476. ;
  4477. Canyon: rfd
  4478.     sdesc = "canyon"
  4479.     noun = 'canyon' 'canyons'
  4480.     adjective = 'awkward' 'sloping' 'secret' 'e/w' 'n/s' 'tight'
  4481.             'tall' 'three'
  4482.     loclist = [
  4483.         In_Debris_Room  In_Awkward_Sloping_E_W_Canyon
  4484.         In_Bird_Chamber  In_Secret_N_S_Canyon_0
  4485.         In_Secret_N_S_Canyon_1  At_Junction_Of_Three_Secret_Canyons
  4486.         In_Secret_E_W_Canyon  In_N_S_Canyon
  4487.         Canyon_Dead_End  In_Tall_E_W_Canyon  Dead_End_8
  4488.         In_Mirror_Canyon  In_Secret_Canyon
  4489.     ]
  4490. ;
  4491. Walls: rfd
  4492.     sdesc = "walls"
  4493.     noun = 'wall' 'walls' 'cracks' 'ceiling' 
  4494.     adjective = 'orange' 'stone' 'swiss' 'cheese' 'cave' 'cavern'
  4495.             'ragged' 'sharp' 'canyon' 'warm' 'hot' 'building'
  4496.             'well' 'house' 'wellhouse'
  4497.     loclist = [
  4498.         Inside_Building In_Cobble_Crawl In_Debris_Room 
  4499.         In_Awkward_Sloping_E_W_Canyon In_Bird_Chamber 
  4500.         At_Top_Of_Small_Pit In_Hall_Of_Mists 
  4501.         On_East_Bank_Of_Fissure In_Nugget_Of_Gold_Room 
  4502.         In_Hall_Of_Mt_King At_West_End_Of_Twopit_Room 
  4503.         In_East_Pit In_West_Pit West_Side_Of_Fissure 
  4504.         Low_N_S_Passage In_South_Side_Chamber 
  4505.         In_West_Side_Chamber At_Y2 Jumble_Of_Rock 
  4506.         At_Window_On_Pit_1 In_Dirty_Passage On_Brink_Of_Pit 
  4507.         In_Pit In_Dusty_Rock_Room 
  4508.         At_West_End_Of_Hall_Of_Mists Alike_Maze_1 
  4509.         Alike_Maze_2 Alike_Maze_3 Alike_Maze_4 Dead_End_1 
  4510.         Dead_End_2 Dead_End_3 Alike_Maze_5 Alike_Maze_6 
  4511.         Alike_Maze_7 Alike_Maze_8 Alike_Maze_9 Dead_End_4 
  4512.         Alike_Maze_10 Dead_End_5 At_Brink_Of_Pit Dead_End_6 
  4513.         At_East_End_Of_Long_Hall At_West_End_Of_Long_Hall 
  4514.         Crossover Dead_End_7 At_Complex_Junction In_Bedquilt 
  4515.         In_Swiss_Cheese_Room At_East_End_Of_Twopit_Room 
  4516.         In_Slab_Room In_Secret_N_S_Canyon_0 
  4517.         In_Secret_N_S_Canyon_1 
  4518.         At_Junction_Of_Three_Secret_Canyons In_Large_Low_Room 
  4519.         Dead_End_Crawl 
  4520.         In_Secret_E_W_Canyon In_N_S_Canyon 
  4521.         Canyon_Dead_End In_Tall_E_W_Canyon Dead_End_8 
  4522.         Alike_Maze_11 Dead_End_9 Dead_End_10 Alike_Maze_12 
  4523.         Alike_Maze_13 Dead_End_11 Dead_End_12 Alike_Maze_14 
  4524.         In_Narrow_Corridor At_Steep_Incline_Above_Large_Room 
  4525.         In_Giant_Room At_Recent_Cave_In 
  4526.         In_Immense_N_S_Passage In_Cavern_With_Waterfall 
  4527.         In_Soft_Room In_Oriental_Room In_Misty_Cavern 
  4528.         In_Alcove In_Plover_Room In_Dark_Room In_Arched_Hall 
  4529.         In_Shell_Room In_Ragged_Corridor In_A_Cul_De_Sac 
  4530.         In_Anteroom Different_Maze_1 At_Witts_End 
  4531.         In_Mirror_Canyon At_Window_On_Pit_2 Atop_Stalactite 
  4532.         Different_Maze_2 At_Reservoir Dead_End_13 At_Ne_End 
  4533.         At_Sw_End On_Sw_Side_Of_Chasm In_Sloping_Corridor 
  4534.         In_Secret_Canyon  On_Ne_Side_Of_Chasm  In_Corridor 
  4535.         At_Fork_In_Path At_Junction_With_Warm_Walls 
  4536.         At_Breath_Taking_View In_Chamber_Of_Boulders 
  4537.         In_Limestone_Passage In_Front_Of_Barren_Room 
  4538.         In_Barren_Room Different_Maze_3 Different_Maze_4 
  4539.         Different_Maze_5 Different_Maze_6 Different_Maze_7 
  4540.         Different_Maze_8 Different_Maze_9 Different_Maze_10 
  4541.         Different_Maze_11 Dead_End_14
  4542.     ]
  4543. ;
  4544. DeadEnd: rfd
  4545.     sdesc = "dead end"
  4546.     noun = 'end'
  4547.     adjective = 'dead'
  4548.     loclist = [
  4549.         Dead_End_1 Dead_End_2 Dead_End_3 Dead_End_4 
  4550.         Dead_End_5 Dead_End_6 Dead_End_7 Dead_End_Crawl 
  4551.         Canyon_Dead_End Dead_End_8 Dead_End_9 Dead_End_10 
  4552.         Dead_End_11 Dead_End_12 Dead_End_13 Dead_End_14
  4553.     ]
  4554. ;
  4555. Hall: rfd
  4556.     sdesc = "hall"
  4557.     noun = 'hall'
  4558.     adjective = 'vast' 'long' 'featureless' 'arched'
  4559.     loclist = [
  4560.         In_Hall_Of_Mists  On_East_Bank_Of_Fissure
  4561.         In_Hall_Of_Mt_King  West_Side_Of_Fissure
  4562.         In_West_Side_Chamber  At_West_End_Of_Hall_Of_Mists
  4563.         At_East_End_Of_Long_Hall At_West_End_Of_Long_Hall
  4564.         In_Arched_Hall
  4565.     ]
  4566. ;
  4567. Hole: rfd
  4568.     sdesc = "hole"
  4569.     noun = 'hole' 'holes'
  4570.     adjective = 'large' 'big' 'round' 'two' 'foot' 'two-foot'
  4571.     loclist = [
  4572.         At_East_End_Of_Twopit_Room
  4573.         In_West_Pit  Low_N_S_Passage  In_Dirty_Passage
  4574.         In_Dusty_Rock_Room  At_East_End_Of_Long_Hall
  4575.         In_Bedquilt  In_Narrow_Corridor  In_Cavern_With_Waterfall
  4576.         At_Reservoir
  4577.     ]
  4578. ;
  4579. Junction: rfd
  4580.     sdesc = "junction"
  4581.     noun = 'junction'
  4582.     adjective = 'complex'
  4583.     loclist = [
  4584.         At_Complex_Junction  At_Junction_Of_Three_Secret_Canyons
  4585.         At_Junction_With_Warm_Walls
  4586.     ]
  4587. ;
  4588. Air: rfd    // If they MUST examine EVERYTHING
  4589.     sdesc = "air"
  4590.     adesc = "air"
  4591.     noun = 'air' 'environment' 'atmosphere' 'wind'
  4592.     adjective = 'sea' 'damp' 'hot' 'stifling'
  4593.     locationOK = true     // tell compiler OK for location to be method
  4594.     location = {
  4595.         return Me.location;    // always where player is
  4596.     }
  4597.     verDoSmell(actor) = {}
  4598.     doSmell(actor) = {
  4599.         "The air smells pretty much like you would expect.";
  4600.     }
  4601. ;
  4602.