[
  {
    "path": ".gitignore",
    "content": ".coverage\nhtmlcov/\n*~\n__pycache__/\n*.pyc\n/MANIFEST\nbuild/\ndist/\n*.egg-info\n"
  },
  {
    "path": "LICENSE.ASF-2",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "Welcome to the git repository for the Python 3 version of Adventure!\nThe project README is one level deeper, inside of the package itself:\n\n[adventure/README.txt](adventure/README.txt)\n"
  },
  {
    "path": "adventure/MANIFEST.in",
    "content": "include LICENSE.*\n"
  },
  {
    "path": "adventure/README.txt",
    "content": "This is a faithful port of the “Adventure” game to Python 3 from the\noriginal 1977 FORTRAN code by Crowther and Woods (it is driven by the\nsame ``advent.dat`` file!) that lets you explore Colossal Cave, where\nothers have found fortunes in treasure and gold, though it is rumored\nthat some who enter are never seen again.\n\nThis page:\n\nhttp://rickadams.org/adventure/e_downloads.html\n\noffers the original PHP source code at this link:\n\nhttp://www.ifarchive.org/if-archive/games/source/advent-original.tar.gz\n\nTo encourage the use of Python 3, the game is designed to be played\nright at the Python prompt.  Single-word commands can be typed by\nthemselves, but two-word commands should be written as a function call\n(since a two-word command would not be valid Python)::\n\n    >>> import adventure\n    >>> adventure.play()\n    WELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?\n\n    >>> no\n    YOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\n    AROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\n    DOWN A GULLY.\n\n    >>> east\n    YOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n    THERE ARE SOME KEYS ON THE GROUND HERE.\n    THERE IS A SHINY BRASS LAMP NEARBY.\n    THERE IS FOOD HERE.\n    THERE IS A BOTTLE OF WATER HERE.\n\n    >>> get(lamp)\n    OK\n\n    >>> leave\n    YOU'RE AT END OF ROAD AGAIN.\n\n    >>> south\n    YOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A\n    ROCKY BED.\n\nThe original Adventure paid attention to only the first five letters of\neach command, so a long command like ``inventory`` could simply be typed\nas ``inven``.  This package defines a symbol for both versions of every\nlong word, so you can type the long or short version as you please.\n\nYou can save your game at any time by calling the ``save()`` command\nwith a filename, and then can resume it later::\n\n    >>> save('advent.save')\n    GAME SAVED\n\n    >>> adventure.resume('advent.save')\n    GAME RESTORED\n    >>> look\n    SORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\n    LONG DESCRIPTION OF YOUR LOCATION.\n    YOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A\n    ROCKY BED.\n\nYou can find two complete, working walkthroughs of the game in its\n``tests`` directory, which you can run using the ``discover`` module that\ncomes built-in with Python 3::\n\n    $ python3 -m unittest discover adventure\n\nI wrote most of this package over Christmas vacation 2010, to learn more\nabout the workings of the game that so enthralled me as a child; the\nproject also gave me practice writing Python 3.  I still forget the\nparentheses when writing ``print()`` if I am not paying attention.\n\nTraditional Mode\n================\n\nYou can also use this package to play Adventure at a traditional prompt\nthat does not require its input to be valid Python.  Use your operating\nsystem command line to run the package::\n\n    $ python3 -m adventure\n    WELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?\n\n    >\n\nAt the prompt that will appear, two-word commands can simply be\nseparated by a space::\n\n    > get lamp\n    OK\n\nFor extra authenticity, the output of the Adventure game in this mode is\ntyped to your screen at 1200 baud.  You will note that although this\nprints the text faster than you can read it anyway, your experience of\nthe game will improve considerably, especially when a move results in a\nsurprise.\n\nWhy is the game better at 1200 baud?  When a paragraph of text is\nallowed to appear on the screen all at once, your eyes scan the entire\nparagraph for important information, often ruining any surprises before\nyou can then settle down and read it from the beginning.  But at 1200\nbaud, you wind up reading the text in order as it appears, which unfolds\nthe narrative sequentially as the author of Adventure intended.\n\nIf you created a file with the in-game ``save`` command, you can restore\nit later by naming it on the command line::\n\n    > save mygame\n    GAME SAVED\n    > quit\n    DO YOU REALLY WANT TO QUIT NOW?\n    > y\n    OK\n\n    $ python3 -m adventure mygame\n    GAME RESTORED\n    >\n\nNotes\n=====\n\n* Several Adventure commands conflict with standard Python built-in\n  functions.  If you want to run the normal Python function ``exit()``,\n  ``open()``, ``quit()``, or ``help()``, then import the ``builtin``\n  module and run the copy of the function stored there.\n\n* The word “break” is a Python keyword, so there was no possibility of\n  using it in the game.  Instead, use one of the two synonyms defined by\n  the PDP version of Adventure: “shatter” or “smash.”\n\nCopyright\n=========\n\nThe ``advent.dat`` game data file distributed with this Python package,\nlike the rest of the original source code for Adventure, is a public\ndomain work.  Phrases from the original work that have been copied into\nmy source code from the FORTRAN source (the famous phrase “You have\ngotten yourself killed” and so forth) remain public domain and can be\nused without attribution.\n\nMy own Python code that re-implements the game engine is:\n\nCopyright 2010–2015 Brandon Rhodes\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\nChangelog\n=========\n\n| 1.6 — 2020 August 15 — add support for upper-case commands typed at the terminal; and fix exception if user dies with water in their bottle `(see #26) <https://github.com/brandon-rhodes/python-adventure/issues/26>`_.\n| 1.5 — 2020 July 18 — fix for fatal exception when “lamp turn” is entered.\n| 1.4 — 2016 January 31 — readline editing; added license; bug fix; test fix.\n| 1.3 — 2012 April 27 — installs on Windows; fixed undefined commands\n| 1.2 — 2012 April 5 — restoring saves from command line; 5-letter commands\n| 1.1 — 2011 March 12 — traditional mode; more flexible Python syntax\n| 1.0 — 2011 February 15 — 100% test coverage, feature-complete\n| 0.3 — 2011 January 31 — first public release\n"
  },
  {
    "path": "adventure/TODO.txt",
    "content": "\n* Test dropping into the secret canyon from the direction that gets no dragon.\n"
  },
  {
    "path": "adventure/__init__.py",
    "content": "\"\"\"The Adventure game.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\nimport sys\n\nif sys.version_info <= (3,):\n    raise RuntimeError('Alas, Adventure requires Python 3 or later')\n\ndef load_advent_dat(data):\n    import os\n    from .data import parse\n\n    datapath = os.path.join(os.path.dirname(__file__), 'advent.dat')\n    with open(datapath, 'r', encoding='ascii') as datafile:\n        parse(data, datafile)\n\ndef play(seed=None):\n    \"\"\"Turn the Python prompt into an Adventure game.\n\n    With optional the `seed` argument the caller can supply an integer\n    to start the Python random number generator at a known state.\n\n    \"\"\"\n    global _game\n\n    from .game import Game\n    from .prompt import install_words\n\n    _game = Game(seed)\n    load_advent_dat(_game)\n    install_words(_game)\n    _game.start()\n    print(_game.output[:-1])\n\ndef resume(savefile, quiet=False):\n    global _game\n\n    from .game import Game\n    from .prompt import install_words\n\n    _game = Game.resume(savefile)\n    install_words(_game)\n    if not quiet:\n        print('GAME RESTORED\\n')\n"
  },
  {
    "path": "adventure/__main__.py",
    "content": "\"\"\"Offer Adventure at a custom command prompt.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\nimport argparse\nimport os\nimport re\nimport readline\nimport sys\nfrom time import sleep\nfrom . import load_advent_dat\nfrom .game import Game\n\nBAUD = 1200\n\ndef baudout(s):\n    out = sys.stdout\n    for c in s:\n        sleep(9. / BAUD)  # 8 bits + 1 stop bit @ the given baud rate\n        out.write(c)\n        out.flush()\n\ndef loop(args):\n    parser = argparse.ArgumentParser(\n        description='Adventure into the Colossal Caves.',\n        prog='{} -m adventure'.format(os.path.basename(sys.executable)))\n    parser.add_argument(\n        'savefile', nargs='?', help='The filename of game you have saved.')\n    args = parser.parse_args(args)\n\n    if args.savefile is None:\n        game = Game()\n        load_advent_dat(game)\n        game.start()\n        baudout(game.output)\n    else:\n        game = Game.resume(args.savefile)\n        baudout('GAME RESTORED\\n')\n\n    while not game.is_finished:\n        line = input('> ').lower()\n        words = re.findall(r'\\w+', line)\n        if words:\n            baudout(game.do_command(words))\n\nif __name__ == '__main__':\n    try:\n        loop(sys.argv[1:])\n    except EOFError:\n        pass\n"
  },
  {
    "path": "adventure/data.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"Parse the original PDP ``advent.dat`` file.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\nfrom operator import attrgetter\nfrom .model import Hint, Message, Move, Object, Room, Word\n\n# The Adventure data file knows only the first five characters of each\n# word in the game, so we have to know the full verion of each word.\n\nlong_words = { w[:5]: w for w in \"\"\"upstream downstream forest\nforward continue onward return retreat valley staircase outside building stream\ncobble inward inside surface nowhere passage tunnel canyon awkward\nupward ascend downward descend outdoors barren across debris broken\nexamine describe slabroom depression entrance secret bedquilt plover\noriental cavern reservoir office headlamp lantern pillow velvet fissure tablet\noyster magazine spelunker dwarves knives rations bottle mirror beanstalk\nstalactite shadow figure drawings pirate dragon message volcano geyser\nmachine vending batteries carpet nuggets diamonds silver jewelry treasure\ntrident shards pottery emerald platinum pyramid pearl persian spices capture\nrelease discard mumble unlock nothing extinguish placate travel proceed\ncontinue explore follow attack strike devour inventory detonate ignite\nblowup peruse shatter disturb suspend sesame opensesame abracadabra\nshazam excavate information\"\"\".split() }\n\nclass Data(object):\n    def __init__(self):\n        self.rooms = {}\n        self.vocabulary = {}\n        self.objects = {}\n        self.messages = {}\n        self.class_messages = []\n        self.hints = {}\n        self.magic_messages = {}\n\n    def referent(self, word):\n        if word.kind == 'noun':\n            return self.objects[word.n % 1000]\n\n# Helper functions.\n\ndef make_object(dictionary, klass, n):\n    if n not in dictionary:\n        dictionary[n] = obj = klass()\n        obj.n = n\n    return dictionary[n]\n\ndef expand_tabs(segments):\n    it = iter(segments)\n    line = next(it)\n    for segment in it:\n        spaces = 8 - len(line) % 8\n        line += ' ' * spaces + segment\n    return line\n\ndef accumulate_message(dictionary, n, line):\n    dictionary[n] = dictionary.get(n, '') + line + '\\n'\n\n# Knowledge of what each section contains.\n\ndef section1(data, n, *etc):\n    \"\"\"Handle record from “Section 1: long form descriptions”.\n\n    Section 1: long form descriptions. Each line contains a location\n    number, a TAB, and a line of text. The set of (necessarily adjacent)\n    lines whose numbers are X form the long description of location X.\n\n    \"\"\"\n    room = make_object(data.rooms, Room, n)\n    if not etc[0].startswith('>$<'):\n        room.long_description += expand_tabs(etc) + '\\n'\n\ndef section2(data, n, line):\n    \"\"\"Handle record from “Section 2: short form descriptions”.\n\n    Section 2: short form descriptions. Same format as long form.  Not\n    all places have short descriptions.\n\n    \"\"\"\n    make_object(data.rooms, Room, n).short_description += line + '\\n'\n\ndef section3(data, x, y, *verbs):\n    \"\"\"Handle record from “Section 3: travel table”.\n\n    Section 3: travel table. Each line contains a location number (X), a\n    second location number (Y), and a list of motion numbers (see\n    section 4).\n\n    Each motion represents a verb which will go to Y if currently at\n    X. Y, in turn, is interpreted as follows. Let M=Y/1000, N=Y MOD\n    1000.\n\n        If N<=300: it is the location to go to.\n\n        If 300<N<=500: N-300 is used in a computed GOTO to a\n        section of special code.\n\n        If N>500: message N-500 from section 6 is printed, and he\n        stays wherever he is.\n\n    Meanwhile, M specifies the conditions on the motion.\n\n        If M=0: it's unconditional.\n        If 0<M<100: it is done with M% probability.\n        If M=100: unconditional, but forbidden to dwarves.\n        If 100<M<=200: he must be carrying object M-100.\n        If 200<M<=300: must be carrying or in same room as M-200.\n        If 300<M<=400: PROP(M MOD 100) must *not* be 0.\n        If 400<M<=500: PROP(M MOD 100) must *not* be 1.\n        If 500<M<=600: PROP(M MOD 100) must *not* be 2, etc.\n\n    If the condition (if any) is not met, then the next *different*\n    \"destination\" value is used (unless it fails to meet *its*\n    conditions, in which case the next is found, etc.).  Typically, the\n    next dest will be for one of the same verbs, so that its only use is\n    as the alternate destination for those verbs. For instance:\n\n        15\t110022\t29\t31\t34\t35\t23\t43\n        15\t14\t29\n\n    This says that, from LOC 15, any of the verbs 29, 31, etc., will\n    take him to 22 if he's carrying object 10, and otherwise will go to\n    14.\n\n        11\t303008\t49\n        11\t9\t50\n\n    This says that, from 11, 49 takes him to 8 unless PROP(3)=0, in\n    which case he goes to 9. Verb 50 takes him to 9 regardless of\n    PROP(3).\n\n    \"\"\"\n    last_travel = data._last_travel\n    if last_travel[0] == x and last_travel[1][0] == verbs[0]:\n        verbs = last_travel[1]  # same first verb implies use whole list\n    else:\n        data._last_travel = [x, verbs]\n\n    m, n = divmod(y, 1000)\n    mh, mm = divmod(m, 100)\n\n    if m == 0:\n        condition = (None,)\n    elif 0 < m < 100:\n        condition = ('%', m)\n    elif m == 100:\n        condition = ('not_dwarf',)\n    elif 100 < m <= 200:\n        condition = ('carrying', mm)\n    elif 200 < m <= 300:\n        condition = ('carrying_or_in_room_with', mm)\n    elif 300 < m:\n        condition = ('prop!=', mm, mh - 3)\n\n    if n <= 300:\n        action = make_object(data.rooms, Room, n)\n    elif 300 < n <= 500:\n        action = n  # special computed goto\n    else:\n        action = make_object(data.messages, Message, n - 500)\n\n    move = Move()\n    if len(verbs) == 1 and verbs[0] == 1:\n        move.is_forced = True\n    else:\n        move.verbs = [ make_object(data.vocabulary, Word, verb_n)\n                       for verb_n in verbs if verb_n < 100 ] # skip bad \"109\"\n    move.condition = condition\n    move.action = action\n    data.rooms[x].travel_table.append(move)\n\ndef section4(data, n, text, *etc):\n    \"\"\"Handle record from “Section 4: vocabulary”.\n\n    Section 4: vocabulary. Each line contains a number (N), a TAB, and a\n    five-letter word. Call M=N/1000. If M=0, then the word is a motion\n    verb for use in travelling (see section 3). Else, if M=1, the word\n    is an object. Else, if M=2, the word is an action verb (such as\n    \"CARRY\" or \"ATTACK\"). Else, if M=3, the word is a special case verb\n    (such as \"DIG\") and N MOD 1000 is an index into section 6. Objects\n    from 50 to (currently, anyway) 79 are considered treasures (for\n    pirate, closeout).\n\n    \"\"\"\n    text = text.lower()\n    text = long_words.get(text, text)\n    word = make_object(data.vocabulary, Word, n)\n    if word.text is None:  # this is the first word with index \"n\"\n        word.text = text\n    else:  # there is already a word sitting at \"n\", so create a synonym\n        original = word\n        word = Word()\n        word.n = n\n        word.text = text\n        original.add_synonym(word)\n    word.kind = ['travel', 'noun', 'verb', 'snappy_comeback'][n // 1000]\n    if word.kind == 'noun':\n        n %= 1000\n        obj = make_object(data.objects, Object, n)\n        obj.names.append(text)\n        obj.is_treasure = (n >= 50)\n        data.objects[text] = obj\n    if text not in data.vocabulary:  # since duplicate names exist\n        data.vocabulary[text] = word\n\ndef section5(data, n, *etc):\n    \"\"\"Handle record from “Section 5: object descriptions”.\n\n    Section 5: object descriptions. Each line contains a number (N), a\n    TAB, and a message. If N is from 1 to 100, the message is the\n    \"inventory\" message for object N. Otherwise, N should be 000, 100,\n    200, etc., and the message should be the description of the\n    preceding object when its PROP value is N/100. The N/100 is used\n    only to distinguish multiple messages from multi-line messages; the\n    PROP info actually requires all messages for an object to be present\n    and consecutive.  Properties which produce no message should be\n    given the message \">$<\".\n\n    \"\"\"\n    if 1 <= n <= 99:\n        data._object = make_object(data.objects, Object, n)\n        data._object.inventory_message = expand_tabs(etc)\n    else:\n        n //= 100\n        messages = data._object.messages\n        if etc[0].startswith('>$<'):\n            more = ''\n        else:\n            more = expand_tabs(etc) + '\\n'\n        messages[n] = messages.get(n, '') + more\n\ndef section6(data, n, *etc):\n    \"\"\"Handle record from “Section 6: arbitrary messages”.\n\n    Section 6: arbitrary messages. Same format as sections 1, 2, and 5,\n    except the numbers bear no relation to anything (except for special\n    verbs in section 4).\n\n    \"\"\"\n    message = make_object(data.messages, Message, n)\n    message.text += expand_tabs(etc) + '\\n'\n\ndef section7(data, n, room_n, fixed=None):\n    \"\"\"Handle record from “Section 7: object locations”.\n\n    Section 7: object locations. Each line contains an object number and\n    its initial location (zero (or omitted) if none).  If the object is\n    immovable, the location is followed by a \"-1\". If it has two\n    locations (e.g. the grate) the first location is followed with the\n    second, and the object is assumed to be immovable.\n\n    \"\"\"\n    obj = make_object(data.objects, Object, n)\n    if room_n:\n        room = make_object(data.rooms, Room, room_n)\n        obj.drop(room)\n    if fixed is not None:\n        if fixed == -1:\n            obj.is_fixed = True\n        else:\n            room2 = make_object(data.rooms, Room, fixed)\n            obj.rooms.append(room2)  # exists two places, like grate\n    obj.starting_rooms = list(obj.rooms)  # remember where things started\n\ndef section8(data, word_n, message_n):\n    \"\"\"Handle record from “Section 8: action defaults”.\n\n    Section 8: action defaults. Each line contains an \"action-verb\"\n    number and the index (in section 6) of the default message for the\n    verb.\n\n    \"\"\"\n    if not message_n:\n        return\n    word = make_object(data.vocabulary, Word, word_n + 2000)\n    message = make_object(data.messages, Message, message_n)\n    for word2 in word.synonyms:\n        word2.default_message = message\n\ndef section9(data, bit, *nlist):\n    \"\"\"Handle record from “Section 9: liquid assets, etc.”.\n\n    Section 9: liquid assets, etc. Each line contains a number (N) and\n    up to 20 location numbers. Bit N (where 0 is the units bit) is set\n    in COND(LOC) for each LOC given. The COND bits currently assigned\n    are:\n\n        0: light\n        1: if bit 2 is on: on for oil, off for water\n        2: liquid asset, see bit 1\n        3: pirate doesn't go here unless following player\n\n    Other bits are used to indicate areas of interest to \"hint\"\n    routines:\n\n        4: trying to get into cave\n        5: trying to catch bird\n        6: trying to deal with snake\n        7: lost in maze\n        8: pondering dark room\n        9: at Witt's End\n\n    COND(LOC) is set to 2, overriding all other bits, if LOC has forced\n    motion.\n\n    \"\"\"\n    for n in nlist:\n        room = make_object(data.rooms, Room, n)\n        if bit == 0:\n            room.is_light = True\n        elif bit == 1:\n            room.liquid = make_object(data.objects, Object, 22) #oil\n        elif bit == 2:\n            room.liquid = make_object(data.objects, Object, 21) #water\n        elif bit == 3:\n            room.is_forbidden_to_pirate = True\n        else:\n            hint = make_object(data.hints, Hint, bit)\n            hint.rooms.append(room)\n\ndef section10(data, score, line, *etc):\n    \"\"\"Handle record from “Section 10: class messages”.\n\n    Section 10: class messages. Each line contains a number (N), a TAB,\n    and a message describing a classification of player. The scoring\n    section selects the appropriate message, where each message is\n    considered to apply to players whose scores are higher than the\n    previous N but not higher than this N. Note that these scores\n    probably change with every modification (and particularly expansion)\n    of the program.\n\n    \"\"\"\n    data.class_messages.append((score, line))\n\ndef section11(data, n, turns_needed, penalty, question_n, message_n):\n    \"\"\"Handle record from “Section 11: hints”.\n\n    Section 11: hints. Each line contains a hint number (corresponding\n    to a COND bit, see section 9), the number of turns he must be at the\n    right LOC(s) before triggering the hint, the points deducted for\n    taking the hint, the message number (section 6) of the question, and\n    the message number of the hint. These values are stashed in the\n    \"HINTS\" array.\n\n    HNTMAX is set to the max hint number (<= HNTSIZ). Numbers 1-3 are\n    unusable since COND bits are otherwise assigned, so 2 is used to\n    remember if he's read the clue in the repository, and 3 is used to\n    remember whether he asked for instructions (gets more turns, but\n    loses points).\n\n    \"\"\"\n    hint = make_object(data.hints, Hint, n)\n    hint.turns_needed = turns_needed\n    hint.penalty = penalty\n    hint.question = make_object(data.messages, Message, question_n)\n    hint.message = make_object(data.messages, Message, message_n)\n\ndef section12(data, n, line):\n    \"\"\"Handle record from “Section 12: magic messages”.\n\n    Section 12: magic messages. Identical to section 6 except put in a\n    separate section for easier reference. Magic messages are used by\n    the startup, maintenance mode, and related routines.\n\n    \"\"\"\n    accumulate_message(data.magic_messages, n, line)\n\n# Process every section of the file in turn.\n\ndef parse(data, datafile):\n    \"\"\"Read the Adventure data file and return a ``Data`` object.\"\"\"\n    data._last_travel = [0, [0]]  # x and verbs used by section 3\n\n    while True:\n        section_number = int(datafile.readline())\n        if not section_number:  # no further sections\n            break\n        store = globals().get('section%d' % section_number)\n        while True:\n            fields = [ (int(field) if field.lstrip('-').isdigit() else field)\n                       for field in datafile.readline().strip().split('\\t') ]\n            if fields[0] == -1:  # end-of-section marker\n                break\n            store(data, *fields)\n\n    del data._last_travel  # state used by section 3\n    del data._object       # state used by section 5\n\n    data.object_list = sorted(set(data.objects.values()), key=attrgetter('n'))\n    #data.room_list = sorted(set(data.rooms.values()), key=attrgetter('n'))\n    for obj in data.object_list:\n        name = obj.names[0]\n        if hasattr(data, name):\n            name = name + '2'  # create identifiers like ROD2, PLANT2\n        setattr(data, name, obj)\n\n    return data\n"
  },
  {
    "path": "adventure/game.py",
    "content": "\"\"\"How we keep track of the state of the game.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\n# Numeric comments scattered through this file refer to FORTRAN line\n# numbers, for those comparing this file and `advent.for`; so \"#2012\"\n# refers to FORTRAN line number 2012 (which you can find easily in the\n# FORTRAN using Emacs with an interactive search for newline-2012-tab,\n# that is typed C-s C-q C-j 2 0 1 2 C-i).\n\nimport os\nimport pickle\nimport random\nimport zlib\nfrom operator import attrgetter\nfrom .data import Data\nfrom .model import Room, Message, Dwarf, Pirate\n\nYESNO_ANSWERS = {'y': True, 'yes': True, 'n': False, 'no': False}\n\nclass Game(Data):\n\n    look_complaints = 3  # how many times to \"SORRY, BUT I AM NOT ALLOWED...\"\n    full_description_period = 5  # how often we use a room's full description\n    full_wests = 0  # how many times they have typed \"west\" instead of \"w\"\n    dwarf_stage = 0  # DFLAG how active the dwarves are\n    dwarves_killed = 0  # DKILL\n    knife_location = None  # KNFLOC\n    foobar = -1  # FOOBAR turn number of most recent still-valid \"fee\"\n    gave_up = False\n    treasures_not_found = 0  # TALLY how many treasures have not yet been seen\n    impossible_treasures = 0  # TALLY2 how many treasures can never be retrieved\n    lamp_turns = 330\n    warned_about_dim_lamp = False\n    bonus = 0  # how they exited the final bonus round\n    is_dead = False  # whether we are currently dead\n    deaths = 0  # how many times the player has died\n    max_deaths = 3  # how many times the player can die\n    turns = 0\n\n    def __init__(self, seed=None):\n        Data.__init__(self)\n        self.output = ''\n        self.yesno_callback = False\n        self.yesno_casual = False       # whether to insist they answer\n\n        self.clock1 = 30                # counts down from finding last treasure\n        self.clock2 = 50                # counts down until cave closes\n        self.is_closing = False         # is the cave closing?\n        self.panic = False              # they tried to leave during closing?\n        self.is_closed = False          # is the cave closed?\n        self.is_done = False            # caller can check for \"game over\"\n        self.could_fall_in_pit = False  # could the player fall into a pit?\n\n        self.random_generator = random.Random()\n        if seed is not None:\n            self.random_generator.seed(seed)\n\n    def random(self):\n        return self.random_generator.random()\n\n    def choice(self, seq):\n        return self.random_generator.choice(seq)\n\n    def write(self, more):\n        \"\"\"Append the Unicode representation of `s` to our output.\"\"\"\n        if more:\n            self.output += str(more).upper()\n            self.output += '\\n'\n\n    def write_message(self, n):\n        self.write(self.messages[n])\n\n    def yesno(self, s, yesno_callback, casual=False):\n        \"\"\"Ask a question and prepare to receive a yes-or-no answer.\"\"\"\n        self.write(s)\n        self.yesno_callback = yesno_callback\n        self.yesno_casual = casual\n\n    # Properties of the cave.\n\n    @property\n    def is_dark(self):\n        lamp = self.objects['lamp']\n        if self.is_here(lamp) and lamp.prop:\n            return False\n        return self.loc.is_dark\n\n    @property\n    def inventory(self):\n        return [ obj for obj in self.object_list if obj.is_toting ]\n\n    @property\n    def treasures(self):\n        return [ obj for obj in self.object_list if obj.is_treasure ]\n\n    @property\n    def objects_here(self):\n        return self.objects_at(self.loc)\n\n    def objects_at(self, room):\n        return [obj for obj in self.object_list if obj.is_at(room)]\n\n    def is_here(self, obj):\n        if isinstance(obj, Dwarf):\n            return self.loc is obj.room\n        else:\n            return obj.is_toting or obj.is_at(self.loc)\n\n    @property\n    def is_finished(self):\n        return (self.is_dead or self.is_done) and not self.yesno_callback\n\n    # Game startup\n\n    def start(self):\n        \"\"\"Start the game.\"\"\"\n\n        # For old-fashioned players, accept five-letter truncations like\n        # \"inven\" instead of insisting on full words like \"inventory\".\n\n        for key, value in list(self.vocabulary.items()):\n            if isinstance(key, str) and len(key) > 5:\n                self.vocabulary[key[:5]] = value\n\n        # Set things going.\n\n        self.chest_room = self.rooms[114]\n        self.bottle.contents = self.water\n        self.yesno(self.messages[65], self.start2)  # want instructions?\n\n    def start2(self, yes):\n        \"\"\"Display instructions if the user wants them.\"\"\"\n        if yes:\n            self.write_message(1)\n            self.hints[3].used = True\n            self.lamp_turns = 1000\n\n        self.oldloc2 = self.oldloc = self.loc = self.rooms[1]\n        self.dwarves = [ Dwarf(self.rooms[n]) for n in (19, 27, 33, 44, 64) ]\n        self.pirate = Pirate(self.chest_room)\n\n        treasures = self.treasures\n        self.treasures_not_found = len(treasures)\n        for treasure in treasures:\n            treasure.prop = -1\n\n        self.describe_location()\n\n    # Routines that handle the aftermath of \"big\" actions like movement.\n    # Although these are called at the end of each `do_command()` cycle,\n    # we place here at the top of `game.py` to mirror the order in the\n    # advent.for file.\n\n    def move_to(self, newloc=None):  #2\n        loc = self.loc\n        if newloc is None:\n            newloc = loc\n\n        if self.is_closing and newloc.is_aboveground:\n            self.write_message(130)\n            newloc = loc  # cancel move and put him back underground\n            if not self.panic:\n                self.clock2 = 15\n                self.panic = True\n\n        must_allow_move = ((newloc is loc) or (loc.is_forced)\n                           or (loc.is_forbidden_to_pirate))\n\n        dwarf_blocking_the_way = any(\n            dwarf.old_room is newloc and dwarf.has_seen_adventurer\n            for dwarf in self.dwarves\n            )\n\n        if not must_allow_move and dwarf_blocking_the_way:\n            newloc = loc  # cancel move they were going to make\n            self.write_message(2)  # dwarf is blocking the way\n\n        self.loc = loc = newloc  #74\n\n        # IF LOC.EQ.0 ?\n        is_dwarf_area = not (loc.is_forced or loc.is_forbidden_to_pirate)\n        if is_dwarf_area and self.dwarf_stage > 0:\n            self.move_dwarves()\n        else:\n            if is_dwarf_area and loc.is_after_hall_of_mists:\n                self.dwarf_stage = 1\n            self.describe_location()\n\n    def move_dwarves(self):\n\n        #6000\n        if self.dwarf_stage == 1:\n\n            # 5% chance per turn of meeting first dwarf\n            if self.loc.is_before_hall_of_mists or self.random() < .95:\n                self.describe_location()\n                return\n            self.dwarf_stage = 2\n            for i in range(2):  # randomly remove 0, 1, or 2 dwarves\n                if self.random() < .5:\n                    self.dwarves.remove(self.choice(self.dwarves))\n            for dwarf in self.dwarves:\n                if dwarf.room is self.loc:  # move dwarf away from our loc\n                    dwarf.start_at(self.rooms[18])\n            self.write_message(3)  # dwarf throws axe and curses\n            self.axe.drop(self.loc)\n            self.describe_location()\n            return\n\n        #6010\n        dwarf_count = dwarf_attacks = knife_wounds = 0\n\n        for dwarf in self.dwarves + [ self.pirate ]:\n\n            locations = { move.action for move in dwarf.room.travel_table\n                          if dwarf.can_move(move)\n                          and move.action is not dwarf.old_room\n                          and move.action is not dwarf.room }\n            # Without stabilizing the order with a sort, the room chosen\n            # would depend on how the Room addresses in memory happen to\n            # order the rooms in the set() - and make it impossible to\n            # test the game by setting the random number generator seed\n            # and then playing through the game.\n            locations = sorted(locations, key=attrgetter('n'))\n            if locations:\n                new_room = self.choice(locations)\n            else:\n                new_room = dwarf.old_room\n            dwarf.old_room, dwarf.room = dwarf.room, new_room\n            if self.loc in (dwarf.room, dwarf.old_room):\n                dwarf.has_seen_adventurer = True\n            elif self.loc.is_before_hall_of_mists:\n                dwarf.has_seen_adventurer = False\n\n            if not dwarf.has_seen_adventurer:\n                continue\n\n            dwarf.room = self.loc\n\n            if dwarf.is_dwarf:\n                dwarf_count += 1\n                # A dwarf cannot walk and attack at the same time.\n                if dwarf.room is dwarf.old_room:\n                    dwarf_attacks += 1\n                    self.knife_location = self.loc\n                    if self.random() < .095 * (self.dwarf_stage - 2):\n                        knife_wounds += 1\n\n            else:  # the pirate\n                pirate = dwarf\n\n                if self.loc is self.chest_room or self.chest.prop >= 0:\n                    continue  # decide that the pirate is not really here\n\n                treasures = [ t for t in self.treasures if t.is_toting ]\n                if (self.platinum in treasures and self.loc.n in (100, 101)):\n                    treasures.remove(self.platinum)\n\n                if not treasures:\n                    h = any( t for t in self.treasures if self.is_here(t) )\n                    one_treasure_left = (self.treasures_not_found ==\n                                         self.impossible_treasures + 1)\n                    shiver_me_timbers = (\n                        one_treasure_left and not h and not(self.chest.rooms)\n                        and self.is_here(self.lamp) and self.lamp.prop == 1\n                        )\n\n                    if not shiver_me_timbers:\n                        if (pirate.old_room != pirate.room\n                            and self.random() < .2):\n                            self.write_message(127)\n                        continue  # pragma: no cover\n\n                    self.write_message(186)\n                    self.chest.drop(self.chest_room)\n                    self.message.drop(self.rooms[140])\n\n                else:\n                    #6022  I'll just take all this booty\n                    self.write_message(128)\n                    if not self.message.rooms:\n                        self.chest.drop(self.chest_room)\n                    self.message.drop(self.rooms[140])\n                    for treasure in treasures:\n                        treasure.drop(self.chest_room)\n\n                #6024\n                pirate.old_room = pirate.room = self.chest_room\n                pirate.has_seen_adventurer = False  # free to move\n\n        # Report what has happened.\n\n        if dwarf_count == 1:\n            self.write_message(4)\n        elif dwarf_count:\n            self.write('There are {} threatening little dwarves in the'\n                       ' room with you.\\n'.format(dwarf_count))\n\n        if dwarf_attacks and self.dwarf_stage == 2:\n            self.dwarf_stage = 3\n\n        if dwarf_attacks == 1:\n            self.write_message(5)\n            k = 52\n        elif dwarf_attacks:\n            self.write('{} of them throw knives at you!\\n'.format(dwarf_attacks))\n            k = 6\n\n        if not dwarf_attacks:\n            pass\n        elif not knife_wounds:\n            self.write_message(k)\n        else:\n            if knife_wounds == 1:\n                self.write_message(k + 1)\n            else:\n                self.write('{} of them get you!\\n'.format(knife_wounds))\n            self.oldloc2 = self.loc\n            self.die()\n            return\n\n        self.describe_location()\n\n    def describe_location(self):  #2000\n\n        loc = self.loc\n\n        if loc.n == 0:\n            self.die()\n\n        could_fall = self.is_dark and self.could_fall_in_pit\n        if could_fall and not loc.is_forced and self.random() < .35:\n            self.die_here()\n            return\n\n        if self.bear.is_toting:\n            self.write_message(141)\n\n        if self.is_dark and not loc.is_forced:\n            self.write_message(16)\n        else:\n            do_short = loc.times_described % self.full_description_period\n            loc.times_described += 1\n            if do_short and loc.short_description:\n                self.write(loc.short_description)\n            else:\n                self.write(loc.long_description)\n\n        if loc.is_forced:\n            self.do_motion(self.vocabulary[2])  # dummy motion verb\n            return\n\n        if loc.n == 33 and self.random() < .25 and not self.is_closing:\n            self.write_message(8)\n\n        # for obj in self.objects.values():\n        #     if obj.rooms and [room.n for room in obj.rooms] != [115]:\n        #         if (len(obj.messages) == 0) or (0 not in obj.messages):\n        #             raise ValueError('%r %r' % (obj, obj.rooms))\n        #             print(obj, obj.rooms)\n\n        if not self.is_dark:\n            for obj in self.objects_here:\n\n                if obj is self.steps and self.gold.is_toting:\n                    continue\n\n                if obj.prop < 0:  # finding a treasure the first time\n                    if self.is_closed:\n                        continue\n                    obj.prop = 1 if obj in (self.rug, self.chain) else 0\n                    self.treasures_not_found -= 1\n                    if (self.treasures_not_found > 0 and\n                        self.treasures_not_found == self.impossible_treasures):\n                        self.lamp_turns = min(35, self.lamp_turns)\n\n                if obj is self.steps and self.loc is self.steps.rooms[1]:\n                    prop = 1\n                else:\n                    prop = obj.prop\n\n                self.write(obj.messages[prop])\n\n        self.finish_turn()\n\n    def say_okay_and_finish(self, *ignored):  #2009\n        self.write_message(54)\n        self.finish_turn()\n\n    #2009 sets SPK=\"OK\" then...\n    #2010 sets SPK to K\n    #2011 speaks SPK then...\n    #2012 blanks VERB and OBJ and calls:\n    def finish_turn(self, obj=None):  #2600\n\n        # Advance random number generator so each input affects future.\n        self.random()\n\n        # Check whether we should offer a hint.\n        for hint in self.hints.values():\n            if hint.turns_needed == 9999 or hint.used:\n                continue\n            if self.loc in hint.rooms:\n                hint.turn_counter += 1\n                if hint.turn_counter >= hint.turns_needed:\n                    if hint.n != 5:  # hint 5 counter does not get reset\n                        hint.turn_counter = 0\n                    if self.should_offer_hint(hint, obj):\n                        hint.turn_counter = 0\n\n                        def callback(yes):\n                            if yes:\n                                self.write(hint.message)\n                                hint.used = True\n                            else:\n                                self.write_message(54)\n\n                        self.yesno(hint.question, callback)\n                        return\n            else:\n                hint.turn_counter = 0\n\n        if self.is_closed:\n            if self.oyster.prop < 0 and self.oyster.is_toting:\n                self.write(self.oyster.messages[1])\n            for obj in self.inventory:\n                if obj.prop < 0:\n                    obj.prop = - 1 - obj.prop\n\n        self.could_fall_in_pit = self.is_dark  #2605\n        if self.knife_location and self.knife_location is not self.loc:\n            self.knife_location = None\n\n    # The central do_command() method, that should be called over and\n    # over again with words supplied by the user.\n\n    def do_command(self, words):\n        \"\"\"Parse and act upon the command in the list of strings `words`.\"\"\"\n        self.output = ''\n        self._do_command(words)\n        return self.output\n\n    def _do_command(self, words):\n        if self.yesno_callback is not None:\n            answer = YESNO_ANSWERS.get(words[0], None)\n            if answer is None:\n                if self.yesno_casual:\n                    self.yesno_callback = None\n                else:\n                    self.write('Please answer the question.')\n                    return\n            else:\n                callback = self.yesno_callback\n                self.yesno_callback = None\n                callback(answer)\n                return\n\n        if self.is_dead:\n            self.write('You have gotten yourself killed.')\n            return\n\n        #2608\n        self.turns += 1\n        if (self.treasures_not_found == 0\n            and self.loc.n >= 15 and self.loc.n != 33):\n            self.clock1 -= 1\n            if self.clock1 == 0:\n                self.start_closing_cave()  # no \"return\", to do their command\n        if self.clock1 < 0:\n            self.clock2 -= 1\n            if self.clock2 == 0:\n                return self.close_cave()  # \"return\", to cancel their command\n\n        if self.lamp.prop == 1:\n            self.lamp_turns -= 1\n\n        if self.lamp_turns <= 30 and self.is_here(self.batteries) \\\n                and self.batteries.prop == 0 and self.is_here(self.lamp):\n            #12000\n            self.write_message(188)\n            self.batteries.prop = 1\n            if self.batteries.is_toting:\n                self.batteries.drop(self.loc)\n            self.lamp_turns += 2500\n            self.warned_about_dim_lamp = False\n        elif self.lamp_turns == 0:\n            #12400\n            self.lamp_turns = -1\n            self.lamp.prop = 0\n            if self.is_here(self.lamp):\n                self.write_message(184)\n        elif self.lamp_turns < 0 and self.loc.is_aboveground:\n            #12600\n            self.write_message(185)\n            self.gave_up = True\n            self.score_and_exit()\n            return\n        elif self.lamp_turns <= 30 and not self.warned_about_dim_lamp \\\n                and self.is_here(self.lamp):\n            #12200\n            self.warned_about_dim_lamp = True\n            if self.batteries.prop == 1:\n                self.write_message(189)\n            elif not self.batteries.rooms:\n                self.write_message(183)\n            else:\n                self.write_message(187)\n\n        self.dispatch_command(words)\n\n    def dispatch_command(self, words):  #19999\n\n        if not 1 <= len(words) <= 2:\n            return self.dont_understand()\n\n        if words[0] == 'save' and len(words) > 1:\n            # Handle suspend separately, since filename can be anything,\n            # and is not restricted to being a vocabulary word (and, in\n            # fact, it can be an open file).\n            return self.t_suspend(words[0], words[1])\n\n        words = [ self.vocabulary.get(word) for word in words ]\n        if None in words:\n            return self.dont_understand()\n\n        word1 = words[0]\n        word2 = words[1] if len(words) == 2 else None\n\n        if word1 == 'enter' and (word2 == 'stream' or word2 == 'water'):\n            if self.loc.liquid is self.water:\n                self.write_message(70)\n            else:\n                self.write_message(43)\n            return self.finish_turn()\n\n        if (word1 == 'enter' or word1 == 'walk') and word2:\n            #2800  'enter house' becomes simply 'house' and so forth\n            word1, word2 = word2, None\n\n        if ((word1 == 'water' or word1 == 'oil') and\n            (word2 == 'plant' or word2 == 'door') and\n            self.is_here(self.referent(word2))):\n            word1, word2 = self.vocabulary['pour'], word1\n\n        if word1 == 'say':\n            return self.t_say(word1, word2) if word2 else self.i_say(word1)\n\n        if word2 == 'say':\n            return self.t_say(word2, word1)\n\n        kinds = (word1.kind, word2.kind if word2 else None)\n\n        #2630\n        if kinds == ('travel', None):\n            if word1.text == 'west':  #2610\n                self.full_wests += 1\n                if self.full_wests == 10:\n                    self.write_message(17)\n            return self.do_motion(word1)\n\n        if kinds == ('snappy_comeback', None):\n            self.write_message(word1.n % 1000)\n            return self.finish_turn()\n\n        if kinds == ('noun', None):\n            verb, noun = None, word1\n        elif kinds == ('verb', None):\n            verb, noun = word1, None\n        elif kinds == ('verb', 'noun'):\n            verb, noun = word1, word2\n        elif kinds == ('noun', 'verb'):\n            noun, verb = word1, word2\n        else:\n            return self.dont_understand()\n\n        if not noun:\n            obj = None\n        else:\n            obj = self.referent(noun)\n            obj_here = self.is_here(obj)\n            if not obj_here:\n                if obj is self.grate:\n                    if self.loc.n in (1, 4, 7):\n                        return self.dispatch_command([ 'depression' ])\n                    elif 9 < self.loc.n < 15:\n                        return self.dispatch_command([ 'entrance' ])\n                elif noun == 'dwarf':\n                    obj_here = any( d.room is self.loc for d in self.dwarves )\n                elif obj is self.bottle.contents and self.is_here(self.bottle):\n                    obj_here = True\n                elif obj is self.loc.liquid:\n                    obj_here = True\n                elif (obj is self.plant and self.is_here(self.plant2)\n                      and self.plant2.prop != 0):\n                    obj = self.plant2\n                    obj_here = True\n                elif obj is self.knife and self.knife_location is self.loc:\n                    self.knife_location = None\n                    self.write_message(116)\n                    return self.finish_turn()\n                elif obj is self.rod and self.is_here(self.rod2):\n                    obj = self.rod2\n                    obj_here = True\n                elif verb and (verb == 'find' or verb == 'inventory'):\n                    obj_here = True  # lie; these verbs work for absent objects\n\n            if not obj_here:\n                return self.i_see_no(noun)\n\n            if not verb:\n                self.write('What do you want to do with the {}?\\n'.format(\n                        noun.text))\n                return self.finish_turn()\n\n        verb_name = verb.synonyms[0].text\n        if obj:\n            method_name = 't_' + verb_name\n            args = (verb, obj)\n        else:\n            method_name = 'i_' + verb_name\n            args = (verb,)\n        method = getattr(self, method_name)\n        method(*args)\n\n    def dont_understand(self):\n        #3000  (a bit earlier than in the Fortran code)\n        n = self.random()\n        if n < 0.20:    # 20% of the entire 1.0 range of random()\n            self.write_message(61)\n        elif n < 0.36:  # 20% of the remaining 0.8 left\n            self.write_message(13)\n        else:\n            self.write_message(60)\n        self.finish_turn()\n\n    def i_see_no(self, thing):\n        self.write('I see no {} here.\\n'.format(getattr(thing, 'text', thing)))\n        self.finish_turn()\n\n    # Motion.\n\n    def do_motion(self, word):  #8\n\n        if word == 'null': #2\n            self.move_to()\n            return\n\n        elif word == 'back':  #20\n            dest = self.oldloc2 if self.oldloc.is_forced else self.oldloc\n            self.oldloc2, self.oldloc = self.oldloc, self.loc\n            if dest is self.loc:\n                self.write_message(91)\n                self.move_to()\n                return\n            alt = None\n            for move in self.loc.travel_table:\n                if move.action is dest:\n                    word = move.verbs[0]  # arbitrary verb going to `dest`\n                    break # Fall through, to attempt the move.\n                elif (isinstance(move.action, Room)\n                      and move.action.is_forced\n                      and move.action.travel_table[0].action is dest):\n                    alt = move.verbs[0]\n            else:  # no direct route is available\n                if alt is not None:\n                    word = alt  # take a forced move if it's the only option\n                else:\n                    self.write_message(140)\n                    self.move_to()\n                    return\n\n        elif word == 'look':  #30\n            if self.look_complaints > 0:\n                self.write_message(15)\n                self.look_complaints -= 1\n            self.loc.times_described = 0\n            self.move_to()\n            self.could_fall_in_pit = False\n            return\n\n        elif word == 'cave':  #40\n            self.write_message(57 if self.loc.is_aboveground else 58)\n            self.move_to()\n            return\n\n        self.oldloc2, self.oldloc = self.oldloc, self.loc\n\n        for move in self.loc.travel_table:\n            if move.is_forced or word in move.verbs:\n                c = move.condition\n\n                if c[0] is None or c[0] == 'not_dwarf':\n                    allowed = True\n                elif c[0] == '%':\n                    allowed = 100 * self.random() < c[1]\n                elif c[0] == 'carrying':\n                    allowed = self.objects[c[1]].is_toting\n                elif c[0] == 'carrying_or_in_room_with':\n                    allowed = self.is_here(self.objects[c[1]])\n                elif c[0] == 'prop!=':\n                    allowed = self.objects[c[1]].prop != c[2]\n\n                if not allowed:\n                    continue\n\n                if isinstance(move.action, Room):\n                    self.move_to(move.action)\n                    return\n\n                elif isinstance(move.action, Message):\n                    self.write(move.action)\n                    self.move_to()\n                    return\n\n                elif move.action == 301:  #30100\n                    inv = self.inventory\n                    if len(inv) != 0 and inv != [ self.emerald ]:\n                        self.write_message(117)\n                        self.move_to()\n                    elif self.loc.n == 100:\n                        self.move_to(self.rooms[99])\n                    else:\n                        self.move_to(self.rooms[100])\n                    return\n\n                elif move.action == 302:  #30200\n                    self.emerald.drop(self.loc)\n                    self.do_motion(word)\n                    return\n\n                elif move.action == 303:  #30300\n                    troll, troll2 = self.troll, self.troll2\n                    if troll.prop == 1:\n                        self.write(troll.messages[1])\n                        troll.prop = 0\n                        troll.rooms = list(troll.starting_rooms)\n                        troll2.destroy()\n                        self.move_to()\n                        return\n                    else:\n                        places = list(troll.starting_rooms)\n                        places.remove(self.loc)\n                        self.loc = places[0]  # \"the other side of the bridge\"\n                        if troll.prop == 0:\n                            troll.prop = 1\n                        if not self.bear.is_toting:\n                            self.move_to()\n                            return\n                        self.write_message(162)\n                        self.chasm.prop = 1\n                        troll.prop = 2\n                        self.bear.drop(self.loc)\n                        self.bear.is_fixed = True\n                        self.bear.prop = 3\n                        if self.spices.prop < 0:\n                            self.impossible_treasures += 1\n                        self.oldloc2 = self.loc  # refuse to strand belongings\n                        self.die()\n                        return\n\n        #50\n        n = word.n\n        if 29 <= n <= 30 or 43 <= n <= 50:\n            self.write_message(9)\n        elif n in (7, 36, 37):\n            self.write_message(10)\n        elif n in (11, 19):\n            self.write_message(11)\n        elif n in (62, 65):\n            self.write_message(42)\n        elif n == 17:\n            self.write_message(80)\n        else:\n            self.write_message(12)\n        self.move_to()\n        return\n\n    # Death and reincarnation.\n\n    def die_here(self):  #90\n        self.write_message(23)\n        self.oldloc2 = self.loc\n        self.die()\n\n    def die(self):  #99\n        self.deaths += 1\n        self.is_dead = True\n\n        if self.is_closing:\n            self.write_message(131)\n            self.score_and_exit()\n            return\n\n        def callback(yes):\n            if yes:\n                self.write_message(80 + self.deaths * 2)\n                if self.deaths < self.max_deaths:\n                    if self.bottle.contents is not None:\n                        self.bottle.contents.hide()\n                    self.is_dead = False\n                    if self.lamp.is_toting:\n                        self.lamp.prop = 0\n                    for obj in self.inventory:\n                        if obj is self.lamp:\n                            obj.drop(self.rooms[1])\n                        else:\n                            obj.drop(self.oldloc2)\n                    self.loc = self.rooms[3]\n                    self.describe_location()\n                    return\n            else:\n                self.write_message(54)\n            self.score_and_exit()\n\n        self.yesno(self.messages[79 + self.deaths * 2], callback)\n\n    # Verbs.\n\n    def ask_verb_what(self, verb, *args):  #8000\n        self.write('{} What?\\n'.format(verb.text))\n        self.finish_turn()\n\n    i_walk = ask_verb_what\n    i_drop = ask_verb_what\n    i_say = ask_verb_what\n    i_nothing = say_okay_and_finish\n    i_wave = ask_verb_what\n    i_calm = ask_verb_what\n    i_rub = ask_verb_what\n    i_throw = ask_verb_what\n    i_find = ask_verb_what\n    i_feed = ask_verb_what\n    i_break = ask_verb_what\n    i_wake = ask_verb_what\n\n    def write_default_message(self, verb, *args):\n        self.write(verb.default_message)\n        self.finish_turn()\n\n    t_nothing = say_okay_and_finish\n    t_calm = write_default_message\n    t_quit = write_default_message\n    t_score = write_default_message\n    t_fee = write_default_message\n    t_brief = write_default_message\n    t_hours = write_default_message\n    t_walk = write_default_message\n\n    def i_carry(self, verb):  #8010\n        is_dwarf_here = any( dwarf.room == self.loc for dwarf in self.dwarves )\n        objs = self.objects_here\n        if len(objs) != 1 or is_dwarf_here:\n            self.ask_verb_what(verb)\n        else:\n            self.t_carry(verb, objs[0])\n\n    def t_carry(self, verb, obj):  #9010\n        if obj.is_toting:\n            self.write(verb.default_message)\n            self.finish_turn()\n            return\n        if obj.is_fixed or len(obj.rooms) > 1:\n            if obj is self.plant and obj.prop <= 0:\n                self.write_message(115)\n            elif obj is self.bear and obj.prop == 1:\n                self.write_message(169)\n            elif obj is self.chain and self.chain.prop != 0:\n                self.write_message(170)\n            else:\n                self.write_message(25)\n            self.finish_turn()\n            return\n        if obj is self.water or obj is self.oil:\n            if self.is_here(self.bottle) and self.bottle.contents is obj:\n                # They want to carry the filled bottle.\n                obj = self.bottle\n            else:\n                # They must mean they want to fill the bottle.\n                if not self.bottle.is_toting:\n                    self.write_message(104)\n                elif self.bottle.contents is not None:\n                    self.write_message(105)\n                else:\n                    self.t_fill(verb, self.bottle)  # hand off control to \"fill\"\n                    return\n                self.finish_turn()\n                return\n        if len(self.inventory) >= 7:\n            self.write_message(92)\n            self.finish_turn()\n            return\n        if obj is self.bird and obj.prop == 0:\n            if self.rod.is_toting:\n                self.write_message(26)\n                self.finish_turn(obj)  # needs obj to decide to give hint\n                return\n            if not self.cage.is_toting:\n                self.write_message(27)\n                self.finish_turn()\n                return\n            self.bird.prop = 1\n        if (obj is self.bird or obj is self.cage) and self.bird.prop != 0:\n            self.bird.carry()\n            self.cage.carry()\n        else:\n            obj.carry()\n            if obj is self.bottle and self.bottle.contents is not None:\n                self.bottle.contents.carry()\n        self.say_okay_and_finish()\n\n    def t_drop(self, verb, obj):  #9020\n        if obj is self.rod and not self.rod.is_toting and self.rod2.is_toting:\n            obj = self.rod2\n\n        if not obj.is_toting:\n            self.write(verb.default_message)\n            self.finish_turn()\n            return\n\n        bird, snake, dragon, bear, troll = self.bird, self.snake, self.dragon, \\\n            self.bear, self.troll\n\n        if obj is bird and self.is_here(snake):\n            self.write_message(30)\n            if self.is_closed:\n                self.wake_repository_dwarves()\n                return\n            snake.prop = 1\n            snake.destroy()\n\n        elif obj is self.coins and self.is_here(self.machine):\n            obj.destroy()\n            self.batteries.drop(self.loc)\n            self.write(self.batteries.messages[0])\n            self.finish_turn()\n            return\n\n        elif obj is bird and self.is_here(dragon) and dragon.prop == 0:\n            self.write_message(154)\n            bird.destroy()\n            bird.prop = 0\n            if snake.rooms:\n                self.impossible_treasures += 1\n            self.finish_turn()\n            return\n\n        elif obj is bear and self.is_here(troll):\n            self.write_message(163)\n            troll.destroy()\n            self.troll2.rooms = list(self.troll.starting_rooms)\n            troll.prop = 2\n\n        elif obj is self.vase and self.loc is not self.rooms[96]:\n            if self.pillow.is_at(self.loc):\n                self.vase.prop = 0\n            else:\n                self.vase.prop = 2\n                self.vase.is_fixed = True\n            self.write(self.vase.messages[self.vase.prop + 1])\n\n        else:\n            self.write_message(54)\n\n        #9021\n        if obj is self.bottle.contents:\n            obj = self.bottle\n        if obj is self.bottle and self.bottle.contents:\n            self.bottle.contents.hide()\n        if obj is self.cage and self.bird.prop != 0:\n            bird.drop(self.loc)\n        elif obj is self.bird:\n            obj.prop = 0\n        obj.drop(self.loc)\n        self.finish_turn()\n        return\n\n    def t_say(self, verb, word):  #9030\n        if word.n in (62, 65, 71, 2025):\n            self.dispatch_command([ word.text ])\n        else:\n            self.write('Okay, \"{}\".'.format(word.text))\n            self.finish_turn()\n\n    def i_unlock(self, verb):  #8040  Handles \"unlock\" case as well\n        objs = (self.grate, self.door, self.oyster, self.clam, self.chain)\n        objs = list(filter(self.is_here, objs))\n        if len(objs) > 1:\n            self.ask_verb_what(verb)\n        elif len(objs) == 1:\n            self.t_unlock(verb, objs[0])\n        else:\n            self.write_message(28)\n            self.finish_turn()\n\n    i_lock = i_unlock\n\n    def t_unlock(self, verb, obj):  #9040  Handles \"lock\" case as well\n        if obj is self.clam or obj is self.oyster:\n            #9046\n            oy = 1 if (obj is self.oyster) else 0\n            if verb == 'lock':\n                self.write_message(61)\n            elif not self.trident.is_toting:\n                self.write_message(122 + oy)\n            elif obj.is_toting:\n                self.write_message(120 + oy)\n            elif obj is self.oyster:\n                self.write_message(125)\n            else:\n                self.write_message(124)\n                self.clam.destroy()\n                self.oyster.drop(self.loc)\n                self.pearl.drop(self.rooms[105])\n        elif obj is self.door:\n            if obj.prop == 1:\n                self.write_message(54)\n            else:\n                self.write_message(111)\n        elif obj is self.cage:\n            self.write_message(32)\n        elif obj is self.keys:\n            self.write_message(55)\n        elif obj is self.grate or obj is self.chain:\n            if not self.is_here(self.keys):\n                self.write_message(31)\n            elif obj is self.chain:\n                #9048\n                if verb == 'unlock':\n                    if self.chain.prop == 0:\n                        self.write_message(37)\n                    elif self.bear.prop == 0:\n                        self.write_message(41)\n                    else:\n                        self.chain.prop = 0\n                        self.chain.is_fixed = False\n                        if self.bear.prop != 3:\n                            self.bear.prop = 2\n                        self.bear.is_fixed = 2 - self.bear.prop\n                        self.write_message(171)\n                else:\n                    #9049\n                    if self.loc not in self.chain.starting_rooms:\n                        self.write_message(173)\n                    elif self.chain.prop != 0:\n                        self.write_message(34)\n                    else:\n                        self.chain.prop = 2\n                        if self.chain.is_toting:\n                            self.chain.drop(self.loc)\n                        self.chain.is_fixed = True\n                        self.write_message(172)\n            elif self.is_closing:\n                if not self.panic:\n                    self.clock2 = 15\n                    self.panic = True\n                self.write_message(130)\n            else:\n                #9043\n                oldprop = obj.prop\n                obj.prop = 0 if verb == 'lock' else 1\n                self.write_message(34 + oldprop + 2 * obj.prop)\n        else:\n            self.write(verb.default_message)\n        self.finish_turn()\n\n    t_lock = t_unlock\n\n    def t_light(self, verb, obj=None):  #9070\n        if not self.is_here(self.lamp):\n            self.write(verb.default_message)\n        elif self.lamp_turns <= 0:\n            self.write_message(184)\n        else:\n            self.lamp.prop = 1\n            self.write_message(39)\n            if self.loc.is_dark:\n                return self.describe_location()\n        self.finish_turn()\n\n    i_light = t_light\n\n    def t_extinguish(self, verb, obj=None):  #9080\n        if not self.is_here(self.lamp):\n            self.write(verb.default_message)\n        else:\n            self.lamp.prop = 0\n            self.write_message(40)\n            if self.loc.is_dark:\n                self.write_message(16)\n        self.finish_turn()\n\n    i_extinguish = t_extinguish\n\n    def t_wave(self, verb, obj):  #9090\n        fissure = self.fissure\n\n        if (obj is self.rod and obj.is_toting and self.is_here(fissure)\n            and not self.is_closing):\n            fissure.prop = 0 if fissure.prop else 1\n            self.write(fissure.messages[2 - fissure.prop])\n        else:\n            if obj.is_toting or (obj is self.rod and self.rod2.is_toting):\n                self.write(verb.default_message)\n            else:\n                self.write_message(29)\n\n        self.finish_turn()\n\n    def i_attack(self, verb):  #9120\n        enemies = [ self.snake, self.dragon, self.troll, self.bear ]\n        if self.dwarf_stage >= 2:\n            enemies.extend(self.dwarves)\n        dangers = list(filter(self.is_here, enemies))\n        if len(dangers) > 1:\n            return self.ask_verb_what(verb)\n        if len(dangers) == 1:\n            return self.t_attack(verb, dangers[0])\n        targets = []\n        if self.is_here(self.bird) and verb != 'throw':\n            targets.append(self.bird)\n        if self.is_here(self.clam) or self.is_here(self.oyster):\n            targets.append(self.clam)\n        if len(targets) > 1:\n            return self.ask_verb_what(verb)\n        elif len(targets) == 1:\n            return self.t_attack(verb, targets[0])\n        else:\n            return self.t_attack(verb, None)\n\n    def t_attack(self, verb, obj):  #9124  (but control goes to 9120 first)\n        if obj is self.bird:\n            if self.is_closed:\n                self.write_message(137)\n            else:\n                obj.destroy()\n                obj.prop = 0\n                if self.snake.rooms:\n                    self.impossible_treasures += 1\n                self.write_message(45)\n        elif obj is self.clam or obj is self.oyster:\n            self.write_message(150)\n        elif obj is self.snake:\n            self.write_message(46)\n        elif obj is self.dwarf:\n            if self.is_closed:\n                self.wake_repository_dwarves()\n                return\n            self.write_message(49)\n        elif obj is self.dragon:\n            if self.dragon.prop != 0:\n                self.write_message(167)\n            else:\n                def callback(yes):\n                    self.write(obj.messages[1])\n                    obj.prop = 2\n                    obj.is_fixed = True\n                    oldroom1 = obj.rooms[0]\n                    oldroom2 = obj.rooms[1]\n                    newroom = self.rooms[ (oldroom1.n + oldroom2.n) // 2 ]\n                    obj.drop(newroom)\n                    self.rug.prop = 0\n                    self.rug.is_fixed = False\n                    self.rug.drop(newroom)\n                    for oldroom in (oldroom1, oldroom2):\n                        for o in self.objects_at(oldroom):\n                            o.drop(newroom)\n                    self.move_to(newroom)\n                self.yesno(self.messages[49], callback, casual=True)\n                return\n        elif obj is self.troll:\n            self.write_message(157)\n        elif obj is self.bear:\n            self.write_message(165 + (self.bear.prop + 1) // 2)\n        else:\n            self.write_message(44)\n        self.finish_turn()\n\n    def i_pour(self, verb):  #9130\n        if self.bottle.contents is None:\n            self.ask_verb_what(verb)\n        else:\n            self.t_pour(verb, self.bottle.contents)\n\n    def t_pour(self, verb, obj):\n        if obj is self.bottle:\n            return self.i_pour(verb)\n        if not obj.is_toting:\n            self.write(verb.default_message)\n        elif obj is not self.oil and obj is not self.water:\n            self.write_message(78)\n        else:\n            self.bottle.prop = 1\n            self.bottle.contents = None\n            obj.hide()\n            if self.is_here(self.plant):\n                if obj is not self.water:\n                    self.write_message(112)\n                else:\n                    self.write(self.plant.messages[self.plant.prop + 1])\n                    self.plant.prop = (self.plant.prop + 2) % 6\n                    self.plant2.prop = self.plant.prop // 2\n                    return self.move_to()\n            elif self.is_here(self.door):\n                #9132\n                self.door.prop = 1 if obj is self.oil else 0\n                self.write_message(113 + self.door.prop)\n            else:\n                self.write_message(77)\n        return self.finish_turn()\n\n    def i_eat(self, verb):  #8140\n        if self.is_here(self.food):\n            self.t_eat(verb, self.food)\n        else:\n            self.ask_verb_what(verb)\n\n    def t_eat(self, verb, obj):  #9140\n        if obj is self.food:\n            #8142\n            self.food.destroy()\n            self.write_message(72)\n        elif obj in (self.bird, self.snake, self.clam, self.oyster,\n                     self.dwarf, self.dragon, self.troll, self.bear):\n            self.write_message(71)\n        else:\n            self.write(verb.default_message)\n        self.finish_turn()\n\n    def i_drink(self, verb):  #9150\n        if self.is_here(self.water) or self.loc.liquid is self.water:\n            self.t_drink(verb, self.water)\n        else:\n            self.ask_verb_what(verb)\n\n    def t_drink(self, verb, obj):  #9150\n        if obj is not self.water:\n            self.write_message(110)\n        elif self.is_here(self.water):\n            self.bottle.prop = 1\n            self.bottle.contents = None\n            self.water.destroy()\n            self.write_message(74)\n        elif self.loc.liquid is self.water:\n            self.write(verb.default_message)\n        self.finish_turn()\n\n    def t_rub(self, verb, obj):  #9160\n        if obj is self.lamp:\n            self.write(verb.default_message)\n        else:\n            self.write_message(71)\n        self.finish_turn()\n\n    def t_throw(self, verb, obj):  #9170\n        if obj is self.rod and not self.rod.is_toting and self.rod2.is_toting:\n            obj = self.rod2\n\n        if not obj.is_toting:\n            self.write(verb.default_message)\n            self.finish_turn()\n            return\n\n        if obj.is_treasure and self.is_here(self.troll):\n            # Pay the troll toll\n            self.write_message(159)\n            obj.destroy()\n            self.troll.destroy()\n            self.troll2.rooms = list(self.troll.starting_rooms)\n            self.finish_turn()\n            return\n\n        if obj is self.food and self.is_here(self.bear):\n            self.t_feed(verb, self.bear)\n            return\n\n        if obj is not self.axe:\n            self.t_drop(verb, obj)\n            return\n\n        dwarves_here = [ d for d in self.dwarves if d.room is self.loc ]\n        if dwarves_here:\n            # 1/3rd chance that throwing the axe kills a dwarf\n            if self.choice((True, False, False)):\n                self.dwarves.remove(dwarves_here[0])\n                self.dwarves_killed += 1\n                if self.dwarves_killed == 1:\n                    self.write_message(149)\n                else:\n                    self.write_message(47)\n            else:\n                self.write_message(48)  # Miss\n            self.axe.drop(self.loc)\n            self.do_motion(self.vocabulary['null'])\n            return\n\n        if self.is_here(self.dragon) and self.dragon.prop == 0:\n            self.write_message(152)\n            self.axe.drop(self.loc)\n            self.do_motion(self.vocabulary['null'])\n            return\n\n        if self.is_here(self.troll):\n            self.write_message(158)\n            self.axe.drop(self.loc)\n            self.do_motion(self.vocabulary['null'])\n            return\n\n        if self.is_here(self.bear) and self.bear.prop == 0:\n            self.write_message(164)\n            self.axe.drop(self.loc)\n            self.axe.is_fixed = True\n            self.axe.prop = 1\n            self.finish_turn()\n            return\n\n        self.t_attack(verb, None)\n\n    def i_quit(self, verb):  #8180\n        def callback(yes):\n            self.write_message(54)\n            if yes:\n                self.score_and_exit()\n        self.yesno(self.messages[22], callback)\n\n    def t_find(self, verb, obj):  #9190\n        if obj.is_toting:\n            self.write_message(24)\n        elif self.is_closed:\n            self.write_message(138)\n        elif (self.is_here(obj) or\n            obj is self.loc.liquid or\n            obj is self.dwarf and any(d.room is self.loc for d in self.dwarves)):\n            self.write_message(94)\n        else:\n            self.write(verb.default_message)\n        self.finish_turn()\n\n    t_inventory = t_find\n\n    def i_inventory(self, verb):  #8200\n        first = True\n        objs = [ obj for obj in self.inventory if obj is not self.bear ]\n        for obj in objs:\n            if first:\n                self.write_message(99)\n                first = False\n            self.write(obj.inventory_message)\n        if self.bear.is_toting:\n            self.write_message(141)\n        if not objs:\n            self.write_message(98)\n        self.finish_turn()\n\n    def t_feed(self, verb, obj):  #9210\n        if obj is self.bird:\n            self.write_message(100)\n        elif obj is self.troll:\n            self.write_message(182)\n        elif obj is self.dragon:\n            if self.dragon.prop != 0:\n                self.write_message(110)\n            else:\n                self.write_message(102)\n        elif obj is self.snake:\n            if self.is_closed or not self.is_here(self.bird):\n                self.write_message(102)\n            else:\n                self.write_message(101)\n                self.bird.destroy()\n                self.bird.prop = 0\n                self.impossible_treasures += 1\n        elif obj is self.dwarf:\n            if self.is_here(self.food):\n                self.write_message(103)\n                self.dwarf_stage += 1\n            else:\n                self.write(verb.default_message)\n        elif obj is self.bear:\n            if not self.is_here(self.food):\n                if self.bear.prop == 0:\n                    self.write_message(102)\n                elif self.bear.prop == 3:\n                    self.write_message(110)\n                else:\n                    self.write(verb.default_message)\n            else:\n                self.food.destroy()\n                self.bear.prop = 1\n                self.axe.is_fixed = False\n                self.axe.prop = 0\n                self.write_message(168)\n        else:\n            self.write_message(14)\n        self.finish_turn()\n\n    def i_fill(self, verb):  #9220\n        if self.is_here(self.bottle):\n            return self.t_fill(verb, self.bottle)\n        self.ask_verb_what(verb)\n\n    def t_fill(self, verb, obj):\n        if obj is self.bottle:\n            liquid = self.loc.liquid\n            if liquid is None:\n                self.write_message(106)\n            elif self.bottle.contents:\n                self.write_message(105)\n            else:\n                self.bottle.contents = liquid\n                self.bottle.prop = 0 if (liquid is self.water) else 2\n                if self.bottle.is_toting:\n                    liquid.is_toting = True\n                if liquid is self.oil:\n                    self.write_message(108)\n                else:\n                    self.write_message(107)\n        elif obj is self.vase:\n            #9222\n            if self.vase.is_toting:\n                if self.loc.liquid is None:\n                    self.write_message(144)\n                else:\n                    self.write_message(145)\n                    self.vase.drop(self.loc)\n                    self.vase.prop = 2\n                    self.vase.is_fixed = True\n            else:\n                self.write(verb.default_message)\n        else:\n            self.write(verb.default_message)\n        self.finish_turn()\n\n    def t_blast(self, verb, obj=None):  #9230\n        if self.rod2.prop < 0 or not self.is_closed:\n            self.write(verb.default_message)\n            self.finish_turn()\n            return\n        if self.is_here(self.rod2):\n            self.bonus = 135\n        elif self.loc.n == 115:\n            self.bonus = 134\n        else:\n            self.bonus = 133\n        self.write_message(self.bonus)\n        self.score_and_exit()\n\n    i_blast = t_blast\n\n    def i_score(self, verb):  #8240\n        score, max_score = self.compute_score(for_score_command=True)\n        self.write('If you were to quit now, you would score {}'\n                   ' out of a possible {}.\\n'.format(score, max_score))\n        def callback(yes):\n            self.write_message(54)\n            if yes:\n                self.score_and_exit()\n        self.yesno(self.messages[143], callback)\n\n    def i_fee(self, verb):  #8250\n        for n in range(5):\n            if verb.synonyms[n].text == verb.text:\n                break  # so that 0=fee, 1=fie, 2=foe, 3=foo, 4=fum\n        if n == 0:\n            self.foobar = self.turns\n            self.write_message(54)\n        elif n != self.turns - self.foobar:\n            self.write_message(151)\n        elif n < 3:\n            self.write_message(54)\n        else:\n            self.foobar = -1\n            eggs = self.eggs\n            start = eggs.starting_rooms[0]\n            if (eggs.is_at(start) or eggs.is_toting and self.loc is start):\n                self.write_message(54)\n            else:\n                troll = self.troll\n                if not eggs.rooms and not troll.rooms and not troll.prop:\n                    self.troll.prop = 1\n                if self.loc is start:\n                    self.write(eggs.messages[0])\n                elif self.is_here(eggs):\n                    self.write(eggs.messages[1])\n                else:\n                    self.write(eggs.messages[2])\n                eggs.rooms = list(eggs.starting_rooms)\n                eggs.is_toting = False\n        self.finish_turn()\n\n    def i_brief(self, verb):  #8260\n        self.write_message(156)\n        self.full_description_period = 10000\n        self.look_complaints = 0\n        self.finish_turn()\n\n    def i_read(self, verb):  #8270\n        if self.is_closed and self.oyster.is_toting:\n            return self.t_read(verb, self.oyster)\n        objs = (self.magazine, self.tablet, self.message)\n        objs = list(filter(self.is_here, objs))\n        if len(objs) != 1 or self.is_dark:\n            self.ask_verb_what(verb)\n        else:\n            self.t_read(verb, objs[0])\n\n    def t_read(self, verb, obj):  #9270\n        if self.is_dark:\n            return self.i_see_no(obj.names[0])\n        elif (obj is self.oyster and not self.hints[2].used and\n              self.oyster.is_toting):\n            def callback(yes):\n                if yes:\n                    self.hints[2].used = True\n                    self.write_message(193)\n                else:\n                    self.write_message(54)\n            self.yesno(self.messages[192], callback)\n        elif obj is self.oyster and self.hints[2].used:\n            self.write_message(194)\n        elif obj is self.message:\n            self.write_message(191)\n        elif obj is self.tablet:\n            self.write_message(196)\n        elif obj is self.magazine:\n            self.write_message(190)\n        else:\n            self.write(verb.default_message)\n        self.finish_turn()\n\n    def t_break(self, verb, obj):  #9280\n        if obj is self.vase and self.vase.prop == 0:\n            self.write_message(198)\n            if self.vase.is_toting:\n                self.vase.drop(self.loc)\n            self.vase.prop = 2\n            self.vase.is_fixed = True\n        elif obj is self.mirror and self.is_closed:\n            self.write_message(197)\n            self.wake_repository_dwarves()\n            return\n        elif obj is self.mirror:\n            self.write_message(148)\n        else:\n            self.write(verb.default_message)\n        self.finish_turn()\n\n    def t_wake(self, verb, obj):  #9290\n        if obj is self.dwarf and self.is_closed:\n            self.write_message(199)\n            self.wake_repository_dwarves()\n        else:\n            self.write(verb.default_message)\n            self.finish_turn()\n\n    def i_suspend(self, verb):\n        self.write('Provide \"{}\" with a filename or open file'.format(\n                verb.text))\n        self.finish_turn()\n\n    def t_suspend(self, verb, obj):\n        if isinstance(obj, str):\n            if os.path.exists(obj):  # pragma: no cover\n                self.write('I refuse to overwrite an existing file.')\n                return\n            savefile = open(obj, 'wb')\n        else:\n            savefile = obj\n        r = self.random_generator  # must replace live object with static state\n        self.random_state = r.getstate()\n        try:\n            del self.random_generator\n            savefile.write(zlib.compress(pickle.dumps(self), 9))\n        finally:\n            self.random_generator = r\n            if savefile is not obj:\n                savefile.close()\n        self.write('Game saved')\n\n    def i_hours(self, verb):\n        self.write('Open all day')\n\n    @classmethod\n    def resume(self, obj):\n        \"\"\"Returns an Adventure game saved to the given file.\"\"\"\n        if isinstance(obj, str):\n            savefile = open(obj, 'rb')\n        else:\n            savefile = obj\n        game = pickle.loads(zlib.decompress(savefile.read()))\n        if savefile is not obj:\n            savefile.close()\n        # Reinstate the random number generator.\n        game.random_generator = random.Random()\n        game.random_generator.setstate(game.random_state)\n        del game.random_state\n        return game\n\n    def should_offer_hint(self, hint, obj): #40000\n        if hint.n == 4:  # cave\n            return self.grate.prop == 0 and not self.is_here(self.keys)\n\n        elif hint.n == 5:  # bird\n            bird = self.bird\n            return self.is_here(bird) and self.rod.is_toting and obj is bird\n\n        elif hint.n == 6:  # snake\n            return self.is_here(self.snake) and not self.is_here(self.bird)\n\n        elif hint.n == 7:  # maze\n            return (not len(self.objects_here) and\n                    not len(self.objects_at(self.oldloc)) and\n                    not len(self.objects_at(self.oldloc2)) and\n                    len(self.inventory) > 1)\n\n        elif hint.n == 8:  # dark\n            return self.emerald.prop != 1 and self.platinum.prop != 1\n\n        elif hint.n == 9:  # witt\n            return True\n\n    def start_closing_cave(self):  #10000\n        self.grate.prop = 0\n        self.fissure.prop = 0\n        del self.dwarves[:]\n        self.troll.destroy()\n        self.troll2.rooms = list(self.troll.starting_rooms)\n        if self.bear.prop != 3:\n            self.bear.destroy()\n        for obj in self.chain, self.axe:\n            obj.prop = 0\n            obj.is_fixed = False\n        self.write_message(129)\n        self.clock1 = -1\n        self.is_closing = True\n\n    def close_cave(self):  #11000\n        ne = self.rooms[115]  # ne end of repository\n        sw = self.rooms[116]\n        for obj in (self.bottle, self.plant, self.oyster, self.lamp,\n                    self.rod, self.dwarf):\n            obj.prop = -2 if obj is self.bottle else -1\n            obj.drop(ne)\n        self.loc = self.oldloc = self.oldloc2 = ne\n        for obj in (self.grate, self.snake, self.bird, self.cage,\n                    self.rod2, self.pillow):\n            obj.prop = -2 if (obj is self.bird or obj is self.snake) else -1\n            obj.drop(sw)\n        self.mirror.rooms = [ne, sw]\n        self.mirror.is_fixed = 1\n        self.is_closed = True\n        for obj in self.inventory:\n            obj.is_toting = False\n        self.write_message(132)\n        self.move_to()\n\n    # TODO: 12000\n    # TODO: 12200\n    # TODO: 12400\n    # TODO: 12600\n\n    def wake_repository_dwarves(self):  #19000\n        self.write_message(136)\n        self.score_and_exit()\n\n    def compute_score(self, for_score_command=False):  #20000\n        score = maxscore = 2\n\n        for treasure in self.treasures:\n            # if ptext(0) is zero?\n            if treasure.n > self.chest.n:\n                value = 16\n            elif treasure is self.chest:\n                value = 14\n            else:\n                value = 12\n\n            maxscore += value\n\n            if treasure.prop >= 0:\n                score += 2\n            if treasure.rooms and treasure.rooms[0].n == 3 \\\n                    and treasure.prop == 0:\n                score += value - 2\n\n        maxscore += self.max_deaths * 10\n        score += (self.max_deaths - self.deaths) * 10\n\n        maxscore += 4\n        if not for_score_command and not self.gave_up:\n            score += 4\n\n        maxscore += 25\n        if self.dwarf_stage:\n            score += 25\n\n        maxscore += 25\n        if self.is_closing:\n            score += 25\n\n        maxscore += 45\n        if self.is_closed:\n            score += {0: 10, 135: 25, 134: 30, 133: 45}[self.bonus]\n\n        maxscore += 1\n        if 108 in (room.n for room in self.magazine.rooms):\n            score += 1\n\n        for hint in list(self.hints.values()):\n            if hint.used:\n                score -= hint.penalty\n\n        return score, maxscore\n\n    def score_and_exit(self):\n        score, maxscore = self.compute_score()\n        self.write('\\nYou scored {} out of a possible {} using {} turns.'\n                   .format(score, maxscore, self.turns))\n        for i, (minimum, text) in enumerate(self.class_messages):\n            if minimum >= score:\n                break\n        self.write('\\n{}\\n'.format(text))\n        if i < len(self.class_messages) - 1:\n            d = self.class_messages[i+1][0] + 1 - score\n            self.write('To achieve the next higher rating, you need'\n                       ' {} more point{}\\n'.format(d, 's' if d > 1 else ''))\n        else:\n            self.write('To achieve the next higher rating '\n                       'would be a neat trick!\\n\\nCongratulations!!\\n')\n        self.is_done = True\n"
  },
  {
    "path": "adventure/model.py",
    "content": "\"\"\"Classes representing Adventure game components.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\nclass Move(object):\n    \"\"\"An entry in the travel table.\"\"\"\n\n    is_forced = False\n    verbs = []\n    condition = None\n    action = None\n\n    def __repr__(self):\n        verblist = [ verb.text for verb in self.verbs ]\n\n        c = self.condition[0]\n        if c is None:\n            condition = ''\n        elif c == '%':\n            condition = ' %d%% of the time' % self.condition[1]\n        elif c == 'not_dwarf':\n            condition = ' if not a dwarf'\n        elif c == 'carrying':\n            condition = ' if carrying %s' % self.condition[1]\n        elif c == 'carrying_or_in_room_with':\n            condition = ' if carrying or in room with %s' % self.condition[1]\n        elif c == 'prop!=':\n            condition = ' if prop %d != %d' % self.condition[1:]\n\n        if isinstance(self.action, Room):\n            action = 'moves to %r' % (self.action.short_description\n                or self.action.long_description[:20]).strip()\n        elif isinstance(self.action, Message):\n            action = 'prints %r' % self.action.text\n        else:\n            action = 'special %d' % self.action\n\n        return '<{}{} {}>'.format('|'.join(verblist), condition, action)\n\nclass Room(object):\n    \"\"\"A location in the game.\"\"\"\n\n    long_description = ''\n    short_description = ''\n    times_described = 0\n    visited = False\n\n    is_light = False\n    is_forbidden_to_pirate = False\n    liquid = None\n    trying_to_get_into_cave = False\n    trying_to_catch_bird = False\n    trying_to_deal_with_snake = False\n    lost_in_maze = False\n    pondering_dark_room = False\n    at_witts_end = False\n\n    def __init__(self):\n        self.travel_table = []\n\n    def __repr__(self):\n        return '<room {} at {}>'.format(self.n, hex(id(self)))\n\n    @property\n    def is_forced(self):\n        return self.travel_table and self.travel_table[0].is_forced\n\n    @property\n    def is_aboveground(self):\n        return 1 <= self.n <= 8\n\n    @property\n    def is_before_hall_of_mists(self):\n        return self.n < 15\n\n    @property\n    def is_after_hall_of_mists(self):\n        return self.n >= 15\n\n    @property\n    def is_dark(self):\n        return not self.is_light\n\nclass Word(object):\n    \"\"\"A word that can be used as part of a command.\"\"\"\n\n    text = None\n    kind = None\n    default_message = None\n\n    def __init__(self):\n        self.synonyms = [ self ]\n\n    def __repr__(self):\n        return '<Word {}>'.format(self.text)\n\n    def __eq__(self, text):\n        return any( word.text == text for word in self.synonyms )\n\n    def add_synonym(self, other):\n        \"\"\"Every word in a group of synonyms shares the same list.\"\"\"\n        self.synonyms.extend(other.synonyms)\n        other.synonyms = self.synonyms\n\nclass Object(object):\n    \"\"\"An object in the game, like a grate, or a rod with a rusty star.\"\"\"\n\n    def __init__(self):\n        self.is_fixed = False\n        self.is_treasure = False\n        self.inventory_message = ''\n        self.messages = {}\n        self.names = []\n        self.prop = 0\n        self.rooms = []\n        self.starting_rooms = []\n        self.is_toting = False\n        self.contents = None  # so the bottle can hold things\n\n    def __repr__(self):\n        return '<Object %d %s %x>' % (self.n, '/'.join(self.names), id(self))\n\n    def __hash__(self):\n        return self.n\n\n    def __eq__(self, other):\n        return any( text == other for text in self.names )\n\n    def is_at(self, room):\n        return room in self.rooms\n\n    def carry(self):\n        self.rooms[:] = []\n        self.is_toting = True\n\n    def drop(self, room):\n        self.rooms[:] = [ room ]\n        self.is_toting = False\n\n    def hide(self):\n        self.rooms[:] = []\n        self.is_toting = False\n\n    def destroy(self):\n        self.hide()\n\nclass Message(object):\n    \"\"\"A message for printing.\"\"\"\n    text = ''\n\n    def __str__(self):\n        return self.text\n\nclass Hint(object):\n    \"\"\"A hint offered if the player loiters in one area too long.\"\"\"\n\n    turns_needed = 0\n    turn_counter = 0\n    penalty = 0\n    question = None\n    message = None\n    used = False\n\n    def __init__(self):\n        self.rooms = []\n\nclass Dwarf(object):\n    is_dwarf = True\n    is_pirate = False\n\n    def __init__(self, room):\n        self.start_at(room)\n        self.has_seen_adventurer = False\n\n    def start_at(self, room):\n        self.room = room\n        self.old_room = room\n\n    def can_move(self, move):\n        if not isinstance(move.action, Room):\n            return False\n        room = move.action\n        return (room.is_after_hall_of_mists\n                and not room.is_forced\n                and not move.condition == ('%', 100))\n\nclass Pirate(Dwarf):\n    is_dwarf = False\n    is_pirate = True\n"
  },
  {
    "path": "adventure/prompt.py",
    "content": "\"\"\"Routines that install Adventure commands for the Python prompt.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\nimport inspect\n\nclass ReprTriggeredPhrase(object):\n    \"\"\"Command that happens when Python calls repr() to print them.\"\"\"\n\n    def __init__(self, game, words):\n        self.game = game\n        self.words = tuple(words)  # protect against caller changing list\n\n    def __repr__(self):\n        \"\"\"Run this command and return the message that results.\"\"\"\n        output = self.game.do_command(self.words)\n        return output.rstrip('\\n') + '\\n'\n\n    def __call__(self, arg=None):\n        \"\"\"Return a compound command of several words, like `get(keys)`.\"\"\"\n        if arg is None:\n            return self\n        words = arg.words if isinstance(arg, ReprTriggeredPhrase) else (arg,)\n        return ReprTriggeredPhrase(self.game, self.words + words)\n\n    def __getattr__(self, name):\n        return ReprTriggeredPhrase(self.game, self.words + (name,))\n\n\ndef install_words(game):\n    # stack()[0] is this; stack()[1] is adventure.play(); so, stack()[2]\n    namespace = inspect.stack()[2][0].f_globals\n    words = [ k for k in game.vocabulary if isinstance(k, str) ]\n    words.append('yes')\n    words.append('no')\n    for word in words:\n        identifier = ReprTriggeredPhrase(game, [ word ])\n        namespace[word] = identifier\n        if len(word) > 5:\n            namespace[word[:5]] = identifier\n"
  },
  {
    "path": "adventure/tests/__init__.py",
    "content": ""
  },
  {
    "path": "adventure/tests/syntax.txt",
    "content": ">>> import adventure\n>>> adventure.play(seed=2)\nWELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?\n<BLANKLINE>\n>>> no\nYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\nAROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\nDOWN A GULLY.\n<BLANKLINE>\n>>> brief\nOKAY, FROM NOW ON I'LL ONLY DESCRIBE A PLACE IN FULL THE FIRST TIME\nYOU COME TO IT.  TO GET THE FULL DESCRIPTION, SAY \"LOOK\".\n<BLANKLINE>\n\nThis doctest exercises all of the different ways that people try to\ninvoke Adventure commands from the Python prompt.\n\nSimple movement can be invoked simply by typing the direction, but some\nplayers will try to call them as functions instead.\n\n>>> s\nYOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A\nROCKY BED.\n<BLANKLINE>\n>>> n()\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\n\nThat pretty much exhausts the possibilities when a word is being used\nalone as a command.  But when two words are being combined, there are\nseveral different ways that they might be called!\n\nOne word can be used as a function and the second as an argument:\n\n>>> goto(building)\nYOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n\nOr, a period can be used to separate the words.  Note that nouns and\nverbs can be in either order.\n\n>>> get.keys\nOK\n<BLANKLINE>\n>>> lamp.get\nOK\n<BLANKLINE>\n\nWhy do we support putting the noun and verb in either order?  Because\nsome users think of verbs as methods supported by the game's nouns, and\nwill format their commands like method calls:\n\n>>> food.get()\nOK\n<BLANKLINE>\n"
  },
  {
    "path": "adventure/tests/test_commands.py",
    "content": "\"\"\"Test suite.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\nfrom unittest import TestCase\nfrom adventure import load_advent_dat\nfrom adventure.game import Game\n\nclass CommandTest(TestCase):\n\n    def setUp(self):\n        game = Game()\n        load_advent_dat(game)\n        self.words = set(w.synonyms[0].text for w in game.vocabulary.values())\n        self.words.remove('suspend')\n\n    def test_intransitive_commands_should_not_throw_exceptions(self):\n        for word in self.words:\n            game = Game()\n            load_advent_dat(game)\n            game.start()\n            game.do_command(['no'])  # WOULD YOU LIKE INSTRUCTIONS?\n            game.do_command([word])\n\n    def test_transitive_commands_should_not_throw_exceptions(self):\n        for word in self.words:\n            game = Game()\n            load_advent_dat(game)\n            game.start()\n            game.do_command(['no'])  # WOULD YOU LIKE INSTRUCTIONS?\n            game.do_command(['enter'])  # so we are next to lamp\n            game.do_command([word, 'lamp'])\n"
  },
  {
    "path": "adventure/tests/test_data.py",
    "content": "\"\"\"Test suite.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\nimport unittest\n\nclass DataTest(unittest.TestCase):\n\n    def setUp(self):\n        from adventure.data import Data\n        from adventure import load_advent_dat\n        self.data = Data()\n        load_advent_dat(self.data)\n\n    def test_long_description(self):\n        self.assertEqual(self.data.rooms[4].long_description, \"\"\"\\\nYOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A\nROCKY BED.\n\"\"\")\n\n    def test_long_description_expands_tabs(self):\n        self.assertIn(\"ALMOST AS IF ALIVE.  A COLD WIND BLOWS\",\n                      self.data.rooms[15].long_description)\n\n    def test_short_description(self):\n        self.assertEqual(self.data.rooms[4].short_description,\n                         \"YOU'RE IN VALLEY.\\n\")\n\n    def test_object_message_expands_tabs(self):\n        self.assertEqual(self.data.objects[24].messages[5], \"\"\"\\\nYOU'VE OVER-WATERED THE PLANT!  IT'S SHRIVELING UP!  IT'S, IT'S...\n\"\"\")\n\n    def test_hint(self):\n        hint = self.data.hints[4]\n        self.assertEqual(hint.turns_needed, 4)\n        self.assertEqual(hint.penalty, 2)\n        self.assertEqual(hint.question.text,\n                         \"ARE YOU TRYING TO GET INTO THE CAVE?\\n\")\n        self.assertEqual(hint.message.text, \"\"\"\\\nTHE GRATE IS VERY SOLID AND HAS A HARDENED STEEL LOCK.  YOU CANNOT\nENTER WITHOUT A KEY, AND THERE ARE NO KEYS NEARBY.  I WOULD RECOMMEND\nLOOKING ELSEWHERE FOR THE KEYS.\n\"\"\")\n\nclass ReprTest(unittest.TestCase):\n\n    def setUp(self):\n        from adventure.data import Data\n        from adventure import load_advent_dat\n        self.data = Data()\n        load_advent_dat(self.data)\n\n    def assertMove(self, room_i, entry_i, s):\n        r = repr(self.data.rooms[room_i].travel_table[entry_i]).strip()\n        self.assertEqual(r, s)\n\n    def test_move_repr_look_good(self):\n        m = self.assertMove\n        m(1, 0, '<road|west|upward moves to \"YOU\\'RE AT HILL IN ROAD.\">')\n        m(108, 0, '<east|north|south|ne|se|sw|nw|upward|d 95% of the time'\n          ' prints \\'YOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND'\n          ' UP BACK IN THE\\\\nMAIN PASSAGE.\\\\n\\'>')\n        m(61, 2, '<south if not a dwarf moves to \\'YOU ARE IN A MAZE OF\\'>')\n        m(15, 3, '<upward|pit|steps|dome|passage|east if carrying 50 moves'\n          ' to \\'THE DOME IS UNCLIMBA\\'>')\n        m(19, 6, '<sw if carrying or in room with 11 moves to '\n          '\"YOU CAN\\'T GET BY THE\">')\n        m(17, 2, '<forward if prop 12 != 1 moves to \"YOU DIDN\\'T MAKE IT.\">')\n\n    def test_move_repr_works_on_all_moves(self):\n        for room in self.data.rooms.values():\n            for i, move in enumerate(room.travel_table):\n                try:\n                    repr(move)\n                except:  # pragma: no cover\n                    print(room, i)\n                    raise\n\n    def test_room_repr(self):\n        self.assertRegex(repr(self.data.rooms[64]), '<room 64 at .*>')\n\n    def test_object_repr(self):\n        self.assertRegex(repr(self.data.objects['chest']),\n                         r'<Object 55 chest/box/treasure .*>')\n\n    def test_word_repr(self):\n        self.assertEqual(repr(self.data.vocabulary['eat']), '<Word eat>')\n"
  },
  {
    "path": "adventure/tests/test_walks.py",
    "content": "\"\"\"Test suite.\n\nCopyright 2010-2015 Brandon Rhodes.  Licensed as free software under the\nApache License, Version 2.0 as detailed in the accompanying README.txt.\n\n\"\"\"\nimport doctest\nimport os\nimport shutil\nimport tempfile\n\ndef load_tests(loader, tests, pattern):\n    cd = ChdirTemp()\n    tests.addTests(doctest.DocFileSuite(\n        '../README.txt', optionflags=doctest.NORMALIZE_WHITESPACE,\n        setUp=cd.setup, tearDown=cd.teardown))\n    tests.addTests(doctest.DocFileSuite('syntax.txt'))\n    tests.addTests(doctest.DocFileSuite('vignettes.txt'))\n    tests.addTests(doctest.DocFileSuite('walkthrough1.txt'))\n    tests.addTests(doctest.DocFileSuite('walkthrough2.txt'))\n    tests.addTests(doctest.DocFileSuite('walkthrough3.txt'))\n    return tests\n\nclass ChdirTemp(object):\n    def setup(self, doctest_object):\n        self.old_directory = os.getcwd()\n        self.tmp_directory = tempfile.mkdtemp()\n        os.chdir(self.tmp_directory)\n\n    def teardown(self, doctest_object):\n        os.chdir(self.old_directory)\n        shutil.rmtree(self.tmp_directory)\n"
  },
  {
    "path": "adventure/tests/vignettes.txt",
    "content": ">>> import io\n>>> from itertools import cycle, islice\n\nThis file tests the behavior of the Adventure game in all sorts of\nspecific situations that would be very tedious to arrange in actual\nwalkthroughs.  As the basis for these tests, we will begin by starting a\ngame, entering the building, and carrying the lamp.\n\n>>> import adventure\n>>> adventure.play(seed=3)\nWELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?\n<BLANKLINE>\n>>> no\nYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\nAROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\nDOWN A GULLY.\n<BLANKLINE>\n>>> brief\nOKAY, FROM NOW ON I'LL ONLY DESCRIBE A PLACE IN FULL THE FIRST TIME\nYOU COME TO IT.  TO GET THE FULL DESCRIPTION, SAY \"LOOK\".\n<BLANKLINE>\n>>> enter\nYOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> on\nYOUR LAMP IS NOW ON.\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> for _room in adventure._game.rooms.values():\n...     _room.times_described = 1  # to avoid long descriptions\n\nNow we can save this game.\n\n>>> savefile = io.BytesIO()\n>>> save(savefile)\nGAME SAVED\n<BLANKLINE>\n\nNow, all of the tests below can begin by calling this restart() function\nto place them back at the beginning of the adventure in a known state.\nIf a room is specified, note that restart() performs two turns in the\nroom before handing back control: the first when it asks the game to\nmove the caller into that room, and the second when it calls look().\n\n>>> def restart(room=None, dwarves=False, objects=(), randoms=None):\n...     \"\"\"Restart the whole Adventure game from our stringio file.\"\"\"\n...\n...     global game\n...     savefile.seek(0)\n...     adventure.resume(savefile, quiet=True)\n...     game = adventure._game\n...     if room is not None:\n...         _go_to(room)\n...     room = game.loc\n...     if not dwarves:\n...         game.dwarf_stage = 2\n...         del game.dwarves[:]\n...     for obj in objects:\n...         if isinstance(obj, adventure.prompt.ReprTriggeredPhrase):\n...             obj = game.referent(game.vocabulary[obj.words[0]])\n...         obj.drop(room)\n...     if randoms is not None:\n...         game.random = list(randoms).pop\n\n>>> class go_to(object):\n...     \"\"\"Special command that warps us directly to a location.\"\"\"\n...\n...     def __init__(self, room):\n...         self.room = room\n...     def __repr__(self):\n...         game.output = ''\n...         _go_to(self.room)\n...         return game.output.rstrip('\\n') + '\\n'\n\n>>> def _go_to(room):\n...     game.move_to(game.rooms[room] if isinstance(room, int) else room)\n\n>>> def quiet(*args):\n...     \"\"\"Run one or more commands without printing their result.\"\"\"\n...\n...     for arg in args:\n...         repr(arg)\n...     return None\n\nWith those definitions complete, we can proceed with the actual tests!\n\n---------------------------------------\nYou Won't Get It Down The Steps, Either\n---------------------------------------\n\n>>> restart(room=18)\n>>> look\nTHIS IS A LOW ROOM WITH A CRUDE NOTE ON THE WALL.  THE NOTE SAYS,\n\"YOU WON'T GET IT UP THE STEPS\".\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\n>>> get(gold)\nOK\n<BLANKLINE>\n>>> go_to(13)\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> w\nYOU'RE AT TOP OF SMALL PIT.\n<BLANKLINE>\n>>> d\nYOU ARE AT THE BOTTOM OF THE PIT WITH A BROKEN NECK.\n<BLANKLINE>\nOH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED.  I MIGHT BE ABLE TO\nHELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS BEFORE.  DO YOU WANT ME\nTO TRY TO REINCARNATE YOU?\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> n\nOK\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 53 OUT OF A POSSIBLE 350 USING 9 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 78 MORE POINTS\n<BLANKLINE>\n>>> look\nYOU HAVE GOTTEN YOURSELF KILLED.\n<BLANKLINE>\n\n-------------------\nPirates and dwarves\n-------------------\n\nIf the dwarves activate when we are standing in one of their starting\nrooms, then does the dwarf at our location get moved successfully to the\ngold nuggets room?\n\n>>> restart(room=41, dwarves=True, randoms=[None, .9, .9, .99])\n>>> [ _dwarf.room.n for _dwarf in game.dwarves ]\n[19, 27, 33, 44, 64]\n>>> e\nA LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE\nAXE AT YOU WHICH MISSED, CURSED, AND RAN AWAY.\n<BLANKLINE>\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\n>>> [ _dwarf.room.n for _dwarf in game.dwarves ]\n[19, 18, 33, 44, 64]\n\nIf the pirate encounters us in the plover room or dark room, does he\nleave the platinum pyramid since learning how to remove it from the room\nis one of the game's puzzles?\n\n>>> restart(room=100, objects=[pyramid])\n>>> look\nYOU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT.  AN EXTREMELY\nNARROW TUNNEL EXITS TO THE WEST.  A DARK CORRIDOR LEADS NE.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\nTHERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SIDE!\n<BLANKLINE>\n>>> get(pyramid)\nOK\n<BLANKLINE>\n>>> get(emerald)\nOK\n<BLANKLINE>\n>>> game.pirate.room = game.loc\n>>> look\nOUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE!  \"HAR, HAR,\"\nHE CHORTLES, \"I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME\nCHEST DEEP IN THE MAZE!\"  HE SNATCHES YOUR TREASURE AND VANISHES INTO\nTHE GLOOM.\n<BLANKLINE>\nYOU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT.  AN EXTREMELY\nNARROW TUNNEL EXITS TO THE WEST.  A DARK CORRIDOR LEADS NE.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\nPLATINUM PYRAMID\n<BLANKLINE>\n\nIf we manage to collect all of the treasures before the pirate spots us,\nthen when we find him he goes to hide his treasure chest in the maze\nwithout any other treasures to accompany it.\n\n>>> restart()\n>>> for t in game.treasures:\n...     if t == 'chest': continue\n...     t.drop(game.loc)\n>>> quiet(look)\n>>> game.dwarf_stage = 2\n>>> game.loc = game.pirate.room = game.rooms[69]\n>>> look\nTHERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU.  AS YOU\nTURN TOWARD THEM, THE BEAM OF YOUR LAMP FALLS ACROSS A BEARDED PIRATE.\nHE IS CARRYING A LARGE CHEST.  \"SHIVER ME TIMBERS!\" HE CRIES, \"I'VE\nBEEN SPOTTED!  I'D BEST HIE MESELF OFF TO THE MAZE TO HIDE ME CHEST!\"\nWITH THAT, HE VANISHES INTO THE GLOOM.\n<BLANKLINE>\nYOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM.\n<BLANKLINE>\n>>> go_to(game.chest_room)\nDEAD END\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\n\nIf several dwarves throw knives that hit us, does a sensible message result?\n\n>>> restart(room=75, dwarves=True, randoms=(.05,.05,.05,.05,.05,.05))\n>>> game.dwarf_stage = 3\n>>> for _dwarf in game.dwarves:\n...     _dwarf.room = game.rooms[75]\n>>> look\nTHERE ARE 5 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n5 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\n5 OF THEM GET YOU!\n<BLANKLINE>\nOH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED.  I MIGHT BE ABLE TO\nHELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS BEFORE.  DO YOU WANT ME\nTO TRY TO REINCARNATE YOU?\n<BLANKLINE>\n\nIf, when a treasure is found, the game figures out that all remaining\ntreasures are impossible to acquire - like the jewelry in the south side\nchamber of the Hall of the Mountain King, if the bird dies before the\nsnake is driven away - then the lamp should be reduced to only having 35\nturns left.\n\n>>> restart()\n>>> for t in game.treasures:\n...     if t == 'jewelry' or t == 'silver': continue\n...     t.drop(game.loc)\n>>> quiet(look)\n>>> game.bird.carry()\n>>> go_to(119)\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nA HUGE GREEN FIERCE DRAGON BARS THE WAY!\n<BLANKLINE>\n>>> drop(bird)\nTHE LITTLE BIRD ATTACKS THE GREEN DRAGON, AND IN AN ASTOUNDING FLURRY\nGETS BURNT TO A CINDER.  THE ASHES BLOW AWAY.\n<BLANKLINE>\n>>> game.lamp_turns\n326\n>>> go_to(28)\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> game.lamp_turns\n35\n\nWe should not be able to pick up a dwarf! (#21)\n\n>>> restart(room=75, dwarves=True, randoms=(1,.05,.05,.05,.05,.05,.3))\n>>> game.dwarf_stage = 3\n>>> game.dwarves[0].room = game.rooms[75]\n>>> take(dwarf)\nYOU CAN'T BE SERIOUS!\n<BLANKLINE>\n\n----------------------------------\nMaking sure that hints are offered\n----------------------------------\n\nIf you act confused, the game should offer you a hint.  Here are quick\n(but certainly not thorough!) tests of whether the logic for each hint\nallows it to be offered.\n\n>>> restart(room=8)\n>>> quiet(look, look)\n>>> look\nYOU ARE IN A 20-FOOT DEPRESSION FLOORED WITH BARE DIRT.  SET INTO THE\nDIRT IS A STRONG STEEL GRATE MOUNTED IN CONCRETE.  A DRY STREAMBED\nLEADS INTO THE DEPRESSION.\n<BLANKLINE>\nTHE GRATE IS LOCKED.\n<BLANKLINE>\nARE YOU TRYING TO GET INTO THE CAVE?\n<BLANKLINE>\n>>> yes\nTHE GRATE IS VERY SOLID AND HAS A HARDENED STEEL LOCK.  YOU CANNOT\nENTER WITHOUT A KEY, AND THERE ARE NO KEYS NEARBY.  I WOULD RECOMMEND\nLOOKING ELSEWHERE FOR THE KEYS.\n<BLANKLINE>\n\n>>> restart(room=13, objects=[rod])\n>>> quiet(get(rod), look, look)\n>>> get(bird)\nTHE BIRD WAS UNAFRAID WHEN YOU ENTERED, BUT AS YOU APPROACH IT BECOMES\nDISTURBED AND YOU CANNOT CATCH IT.\n<BLANKLINE>\nARE YOU TRYING TO CATCH THE BIRD?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n\n>>> restart(room=19)\n>>> quiet(*[ look ] * 6)\n>>> look\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\nA HUGE GREEN FIERCE SNAKE BARS THE WAY!\n<BLANKLINE>\nARE YOU TRYING TO SOMEHOW DEAL WITH THE SNAKE?\n<BLANKLINE>\n\n>>> restart(room=42, objects=[food])\n>>> quiet(get(food), s, n)\n>>> quiet(*islice(cycle((w, s, n)), 75 - 5))\n>>> look\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\nDO YOU NEED HELP GETTING OUT OF THE MAZE?\n<BLANKLINE>\n>>> yes\nYOU CAN MAKE THE PASSAGES LOOK LESS ALIKE BY DROPPING THINGS.\n<BLANKLINE>\n\n>>> quiet(restart(room=99))\n>>> quiet([ look ] * (25 - 2))\n>>> look\nYOU ARE IN AN ALCOVE.  A SMALL NW PATH SEEMS TO WIDEN AFTER A SHORT\nDISTANCE.  AN EXTREMELY TIGHT TUNNEL LEADS EAST.  IT LOOKS LIKE A VERY\nTIGHT SQUEEZE.  AN EERIE LIGHT CAN BE SEEN AT THE OTHER END.\n<BLANKLINE>\nARE YOU TRYING TO EXPLORE BEYOND THE PLOVER ROOM?\n<BLANKLINE>\n\n>>> quiet(restart(room=108), [ look ] * (20 - 2))\n>>> look\nYOU ARE AT WITT'S END.  PASSAGES LEAD OFF IN *ALL* DIRECTIONS.\n<BLANKLINE>\nDO YOU NEED HELP GETTING OUT OF HERE?\n<BLANKLINE>\n\n------------------------\nYour lamp is getting dim\n------------------------\n\nThere is an elaborate set of messages generated for the player as their\nlamp starts to grow dim.  You can, of course, replentish the lamp using\nbatteries from the vending machine in the maze.\n\n>>> quiet(restart(room=34))\n>>> game.chest.prop = 1\n>>> quiet([ look ] * (330 - 30 - 3))\n>>> look\nYOUR LAMP IS GETTING DIM.  YOU'D BEST START WRAPPING THIS UP, UNLESS\nYOU CAN FIND SOME FRESH BATTERIES.  I SEEM TO RECALL THERE'S A VENDING\nMACHINE IN THE MAZE.  BRING SOME COINS WITH YOU.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> quiet(go_to(30), get(coins))\n>>> go_to(140)\nDEAD END\n<BLANKLINE>\nTHERE IS A MASSIVE VENDING MACHINE HERE.  THE INSTRUCTIONS ON IT READ:\n\"DROP COINS HERE TO RECEIVE FRESH BATTERIES.\"\n<BLANKLINE>\n>>> drop(coins)\nTHERE ARE FRESH BATTERIES HERE.\n<BLANKLINE>\n>>> look\nYOUR LAMP IS GETTING DIM.  I'M TAKING THE LIBERTY OF REPLACING THE\nBATTERIES.\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A MASSIVE VENDING MACHINE HERE.  THE INSTRUCTIONS ON IT READ:\n\"DROP COINS HERE TO RECEIVE FRESH BATTERIES.\"\n<BLANKLINE>\nSOME WORN-OUT BATTERIES HAVE BEEN DISCARDED NEARBY.\n<BLANKLINE>\n>>> game.lamp_turns = 31\n>>> n\nYOUR LAMP IS GETTING DIM, AND YOU'RE OUT OF SPARE BATTERIES.  YOU'D\nBEST START WRAPPING THIS UP.\n<BLANKLINE>\nYOU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL DIFFERENT.\n<BLANKLINE>\n>>> game.lamp_turns = 1\n>>> n\nYOUR LAMP HAS RUN OUT OF POWER.\n<BLANKLINE>\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> go_to(5)\nYOU'RE IN FOREST.\n<BLANKLINE>\n>>> w\nTHERE'S NOT MUCH POINT IN WANDERING AROUND OUT HERE, AND YOU CAN'T\nEXPLORE THE CAVE WITHOUT A LAMP.  SO LET'S JUST CALL IT A DAY.\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 61 OUT OF A POSSIBLE 350 USING 309 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 70 MORE POINTS\n<BLANKLINE>\n\nIf the batteries are in the user's inventory when replaced, then the old\nones are tossed on the ground rather than remaining in the inventory.\n\n>>> restart(room=30)\n>>> quiet(get(coins), go_to(140), drop(coins))\n>>> get(batteries)\nOK\n<BLANKLINE>\n>>> game.chest.prop = 1\n>>> game.lamp_turns = 30\n>>> look\nYOUR LAMP IS GETTING DIM.  I'M TAKING THE LIBERTY OF REPLACING THE\nBATTERIES.\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A MASSIVE VENDING MACHINE HERE.  THE INSTRUCTIONS ON IT READ:\n\"DROP COINS HERE TO RECEIVE FRESH BATTERIES.\"\n<BLANKLINE>\nSOME WORN-OUT BATTERIES HAVE BEEN DISCARDED NEARBY.\n<BLANKLINE>\n\nFinally, if you leave the batteries in the maze, you are warned to go\nback and get them.\n\n>>> quiet(restart(room=34), go_to(30), get(coins), go_to(140), drop(coins), n)\n>>> game.lamp_turns = 30\n>>> look\nYOUR LAMP IS GETTING DIM.  YOU'D BEST GO BACK FOR THOSE BATTERIES.\n<BLANKLINE>\nYOU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL DIFFERENT.\n<BLANKLINE>\n\n----------------------------------\nBasic and advanced command parsing\n----------------------------------\n\nVarious complaints are associated with poorly-chosen requests.\n\n>>> quiet(restart(room=34))\n>>> enter(water)\nWHERE?\n<BLANKLINE>\n>>> quiet(go_to(7))\n>>> enter(water)\nYOUR FEET ARE NOW WET.\n<BLANKLINE>\n\nYou can try to enter the house with the 'enter' command instead of just\nnaming the house.\n\n>>> quiet(restart(room=1))\n>>> enter(house)\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n\nBoth \"oil\" and \"water\" can be used as verbs, despite officially being\ntreated as nouns in the game vocabulary.\n\n>>> restart(room=94)\n>>> look\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> oil(door)\nI SEE NO OIL HERE.\n<BLANKLINE>\n>>> go_to(25)\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A TINY LITTLE PLANT IN THE PIT, MURMURING \"WATER, WATER, ...\"\n<BLANKLINE>\n>>> water(plant)\nI SEE NO WATER HERE.\n<BLANKLINE>\n\nVarious combinations of words yield somewhat sensible retorts; and\nseveral nouns invoke small special cases in the code, like \"grate\" also\nbeing a movement noun.\n\n>>> restart(room=4, dwarves=True)\n>>> look\nYOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A\nROCKY BED.\n<BLANKLINE>\n\n>>> game.do_command(['eat', 'pray', 'love'])\n\"I DON'T KNOW THAT WORD.\\n\\n\"\n\n>>> grate\nYOU'RE OUTSIDE GRATE.\n<BLANKLINE>\nTHE GRATE IS LOCKED.\n<BLANKLINE>\n>>> go_to(12)\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> grate\nYOU'RE BELOW THE GRATE.\n<BLANKLINE>\nTHE GRATE IS LOCKED.\n<BLANKLINE>\n\n>>> carry(dwarf)\nI SEE NO DWARF HERE.\n<BLANKLINE>\n\n>>> quiet(go_to(3))\n>>> get(water)\nOK\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\nSMALL BOTTLE\nWATER IN THE BOTTLE\n<BLANKLINE>\n\n>>> get(knife)\nI SEE NO KNIFE HERE.\n<BLANKLINE>\n>>> game.dwarf_stage = 2\n>>> go_to(27)\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\n>>> get(knife)\nTHE DWARVES' KNIVES VANISH AS THEY STRIKE THE WALLS OF THE CAVE.\n<BLANKLINE>\n>>> get(knife)\nI SEE NO KNIFE HERE.\n<BLANKLINE>\n\n>>> find(jewelry)\nI CAN ONLY TELL YOU WHAT YOU SEE AS YOU MOVE ABOUT AND MANIPULATE\nTHINGS.  I CANNOT TELL YOU WHERE REMOTE THINGS ARE.\n<BLANKLINE>\n\n>>> lamp\nWHAT DO YOU WANT TO DO WITH THE LAMP?\n<BLANKLINE>\n\n>>> quiet(restart(randoms=(None, 0.1, None, 0.3, None, 0.9)))\n>>> carry(pour)\nI DON'T KNOW THAT WORD.\n<BLANKLINE>\n>>> jump(eat)\nI DON'T UNDERSTAND THAT!\n<BLANKLINE>\n>>> throw(drop)\nWHAT?\n<BLANKLINE>\n\n---------------\nSpecial motions\n---------------\n\nThe \"back\" movement command has to handle several special cases, in case\nthe previous location was an intermediate \"forced\" room, or if it simply\ncannot figure out how to return you to the previous location.\n\n>>> quiet(restart(room=65, randoms=(None, None, 0.001,)))\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> back\nSORRY, BUT I NO LONGER SEEM TO REMEMBER HOW IT WAS YOU GOT HERE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n\nWhile testing \"back\" on the beanstalk, we also test for whether we can\nrun a command like \"get\" on the plant as seen from outside the pits.\n\n>>> quiet(restart(), get(bottle), go_to(25), pour(water))\n>>> quiet(go_to(113), get(water), go_to(25), pour(water))\n>>> go_to(88)\nYOU'RE IN NARROW CORRIDOR.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> back\nYOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP.\n<BLANKLINE>\nYOU'RE IN NARROW CORRIDOR.\n<BLANKLINE>\n>>> go_to(23)\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> find(beanstalk)\nI BELIEVE WHAT YOU WANT IS RIGHT HERE WITH YOU.\n<BLANKLINE>\n>>> go_to(67)\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n\n>>> go_to(91)\nYOU'RE AT STEEP INCLINE ABOVE LARGE ROOM.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> back\nYOU CAN'T GET THERE FROM HERE.\n<BLANKLINE>\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n\nIf the player tries walking back across the troll bridge while still\ncarrying the bear, then disaster strikes: the bridge breaks beneath\nthem, and both player and bear wind up dead at the bottom of the pit.\nBut the game shows a bit of elegance, and refuses to strand the player's\nbelongings out of reach, either at the pit bottom or where they were\nlast standing on the far side of the troll bridge - since without the\nbridge, the items would be permanently lost!  (We also try feeding the\nbear a few times, to test some special cases in the feed() logic while\nwe are at it.)\n\n>>> quiet(restart(), get(keys), go_to(123))\n>>> game.bear.carry()\n>>> game.bear.prop = 2\n>>> game.bear.is_fixed = False\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE ON NE SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> drop(bear)\nTHE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A STARTLED SHRIEK AND\nSCURRIES AWAY.  THE BEAR SOON GIVES UP THE PURSUIT AND WANDERS BACK.\n<BLANKLINE>\n>>> feed(bear)\nTHERE IS NOTHING HERE TO EAT.\n<BLANKLINE>\n>>> get(bear)\nOK\n<BLANKLINE>\n>>> sw\nJUST AS YOU REACH THE OTHER SIDE, THE BRIDGE BUCKLES BENEATH THE\nWEIGHT OF THE BEAR, WHICH WAS STILL FOLLOWING YOU AROUND.  YOU\nSCRABBLE DESPERATELY FOR SUPPORT, BUT AS THE BRIDGE COLLAPSES YOU\nSTUMBLE BACK AND FALL INTO THE CHASM.\n<BLANKLINE>\nOH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED.  I MIGHT BE ABLE TO\nHELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS BEFORE.  DO YOU WANT ME\nTO TRY TO REINCARNATE YOU?\n<BLANKLINE>\n>>> quiet(yes, leave, get(lamp), on)\n>>> go_to(117)\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHE WRECKAGE OF A BRIDGE (AND A DEAD BEAR) CAN BE SEEN AT THE BOTTOM\nOF THE CHASM.\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> feed(bear)\nDON'T BE RIDICULOUS!\n<BLANKLINE>\n\nSeveral motion words elicit special messages when they do not apply.\n\n>>> quiet(restart(room=34))\n>>> onward\nI AM UNSURE HOW YOU ARE FACING.  USE COMPASS POINTS OR NEARBY OBJECTS.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> left\nI AM UNSURE HOW YOU ARE FACING.  USE COMPASS POINTS OR NEARBY OBJECTS.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> right\nI AM UNSURE HOW YOU ARE FACING.  USE COMPASS POINTS OR NEARBY OBJECTS.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n\n>>> leave\nI DON'T KNOW IN FROM OUT HERE.  USE COMPASS POINTS OR NAME SOMETHING\nIN THE GENERAL DIRECTION YOU WANT TO GO.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> inward\nI DON'T KNOW IN FROM OUT HERE.  USE COMPASS POINTS OR NAME SOMETHING\nIN THE GENERAL DIRECTION YOU WANT TO GO.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n\n>>> xyzzy\nNOTHING HAPPENS.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> plugh\nNOTHING HAPPENS.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n\n>>> crawl\nWHICH WAY?\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n\n---------------\nVerb edge cases\n---------------\n\nAnd now, we exercise dozens of fiddly edge cases for verbs.\n\n>>> quiet(restart())\n>>> carry                       # ambiguous in the face of several objects\nCARRY WHAT?\n<BLANKLINE>\n\n>>> quiet(restart(room=25))\n>>> get(plant)\nTHE PLANT HAS EXCEPTIONALLY DEEP ROOTS AND CANNOT BE PULLED FREE.\n<BLANKLINE>\n\n>>> quiet(restart(), go_to(24))\n>>> get(oil)\nYOU HAVE NOTHING IN WHICH TO CARRY IT.\n<BLANKLINE>\n>>> quiet(go_to(3), get(bottle), go_to(24))\n>>> get(oil)\nYOUR BOTTLE IS ALREADY FULL.\n<BLANKLINE>\n>>> get(bottle)\nYOU ARE ALREADY CARRYING IT!\n<BLANKLINE>\n>>> drop(oil)\nYOU AREN'T CARRYING IT!\n<BLANKLINE>\n>>> drop(water)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE AT THE BOTTOM OF THE EASTERN PIT IN THE TWOPIT ROOM.  THERE IS\nA SMALL POOL OF OIL IN ONE CORNER OF THE PIT.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n\n>>> restart(room=94, objects=[clam])\n>>> look\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\nTHERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED.\n<BLANKLINE>\n>>> unlock                      # two unlockable objects are present\nUNLOCK WHAT?\n<BLANKLINE>\n>>> quiet(s)\n>>> unlock                      # no unlockable objects also cause a problem\nTHERE IS NOTHING HERE WITH A LOCK!\n<BLANKLINE>\n\n>>> restart(room=103, objects=[trident])\n>>> lock(clam)\nWHAT?\n<BLANKLINE>\n>>> quiet(get(clam), get(trident))\n>>> unlock\nI ADVISE YOU TO PUT DOWN THE CLAM BEFORE OPENING IT.  >STRAIN!<\n<BLANKLINE>\n>>> quiet(drop(clam))\n>>> unlock\nA GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS AWAY.  GOODNESS,\nTHIS MUST REALLY BE AN OYSTER.  (I NEVER WAS VERY GOOD AT IDENTIFYING\nBIVALVES.)  WHATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAIN.\n<BLANKLINE>\n>>> unlock\nTHE OYSTER CREAKS OPEN, REVEALING NOTHING BUT OYSTER INSIDE.  IT\nPROMPTLY SNAPS SHUT AGAIN.\n<BLANKLINE>\n\n>>> restart(room=94)\n>>> look\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> unlock\nTHE DOOR IS EXTREMELY RUSTY AND REFUSES TO OPEN.\n<BLANKLINE>\n\n>>> restart()\n>>> unlock(keys)\nYOU CAN'T UNLOCK THE KEYS.\n<BLANKLINE>\n>>> quiet(get(keys), get(food), go_to(10))\n>>> unlock(cage)\nIT HAS NO LOCK.\n<BLANKLINE>\n>>> quiet(go_to(130))\n>>> lock(chain)\nIT WAS ALREADY LOCKED.\n<BLANKLINE>\n>>> unlock(chain)\nTHERE IS NO WAY TO GET PAST THE BEAR TO UNLOCK THE CHAIN, WHICH IS\nPROBABLY JUST AS WELL.\n<BLANKLINE>\n>>> quiet(throw(food), unlock(chain))\n>>> unlock(chain)\nIT WAS ALREADY UNLOCKED.\n<BLANKLINE>\n>>> quiet(get(chain), w)\n>>> lock(chain)\nTHERE IS NOTHING HERE TO WHICH THE CHAIN CAN BE LOCKED.\n<BLANKLINE>\n>>> quiet(e)\n>>> lock(chain)\nTHE CHAIN IS NOW LOCKED.\n<BLANKLINE>\n>>> get(chain)\nTHE CHAIN IS STILL LOCKED.\n<BLANKLINE>\n>>> lock(bear)\nI DON'T KNOW HOW TO LOCK OR UNLOCK SUCH A THING.\n<BLANKLINE>\n\n>>> restart()\n>>> off\nYOUR LAMP IS NOW OFF.\n<BLANKLINE>\n>>> quiet(drop(lamp), leave)\n>>> on\nYOU HAVE NO SOURCE OF LIGHT.\n<BLANKLINE>\n>>> off\nYOU HAVE NO SOURCE OF LIGHT.\n<BLANKLINE>\n>>> quiet(enter, get(lamp), on, plugh)\n>>> off\nYOUR LAMP IS NOW OFF.\n<BLANKLINE>\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> quiet(on)\n>>> game.lamp_turns = 2\n>>> quiet(look)\n>>> look\nYOUR LAMP HAS RUN OUT OF POWER.\n<BLANKLINE>\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> on\nYOUR LAMP HAS RUN OUT OF POWER.\n<BLANKLINE>\n\n>>> restart()\n>>> wave(lamp)\nNOTHING HAPPENS.\n<BLANKLINE>\n>>> wave(keys)\nYOU AREN'T CARRYING IT!\n<BLANKLINE>\n\nThe \"attack\" verb is a particularly long test, because its intransitive\nform works hard to determine - in two stages, focusing first on real\nenemies and then on some harmless objects - what on earth you could\npossibly be designating as a target.\n\n>>> restart(dwarves=True)\n>>> attack\nTHERE IS NOTHING HERE TO ATTACK.\n<BLANKLINE>\n>>> quiet(go_to(117))\n>>> attack\nTROLLS ARE CLOSE RELATIVES WITH THE ROCKS AND HAVE SKIN AS TOUGH AS\nTHAT OF A RHINOCEROS.  THE TROLL FENDS OFF YOUR BLOWS EFFORTLESSLY.\n<BLANKLINE>\n>>> game.dwarf_stage = 2\n>>> game.dwarves[0].room = game.loc\n>>> attack                      # now there are two choices: dwarf and troll\nATTACK WHAT?\n<BLANKLINE>\n>>> attack(dwarf)\nWITH WHAT?  YOUR BARE HANDS?\n<BLANKLINE>\n>>> quiet(go_to(103), get(clam), go_to(13))\n>>> attack                      # cannot decide between oyster and bird\nATTACK WHAT?\n<BLANKLINE>\n>>> quiet(w, drop(clam), e)\n>>> attack\nTHE LITTLE BIRD IS NOW DEAD.  ITS BODY DISAPPEARS.\n<BLANKLINE>\n>>> look                        # make sure the bird is really gone\nYOU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH.  THE WALLS ARE FROZEN\nRIVERS OF ORANGE STONE.  AN AWKWARD CANYON AND A GOOD PASSAGE EXIT\nFROM EAST AND WEST SIDES OF THE CHAMBER.\n<BLANKLINE>\n>>> quiet(w)\n>>> attack\nTHE SHELL IS VERY STRONG AND IS IMPERVIOUS TO ATTACK.\n<BLANKLINE>\n>>> quiet(go_to(119))\n>>> attack(dragon)\nWITH WHAT?  YOUR BARE HANDS?\n<BLANKLINE>\n>>> quiet(yes)\n>>> attack(dragon)\nFOR CRYING OUT LOUD, THE POOR THING IS ALREADY DEAD!\n<BLANKLINE>\n\n>>> quiet(restart(), get(bottle))\n>>> pour\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> pour\nPOUR WHAT?\n<BLANKLINE>\n>>> quiet(go_to(24), get(oil), go_to(25))\n>>> pour(bottle)\nTHE PLANT INDIGNANTLY SHAKES THE OIL OFF ITS LEAVES AND ASKS, \"WATER?\"\n<BLANKLINE>\n>>> quiet(go_to(24), get(oil))\n>>> pour\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> pour(oil)\nYOU AREN'T CARRYING IT!\n<BLANKLINE>\n>>> pour(lamp)\nYOU CAN'T POUR THAT.\n<BLANKLINE>\n\n>>> restart()\n>>> eat\nTHANK YOU, IT WAS DELICIOUS!\n<BLANKLINE>\n>>> eat\nEAT WHAT?\n<BLANKLINE>\n>>> quiet(go_to(13))\n>>> eat(bird)\nI THINK I JUST LOST MY APPETITE.\n<BLANKLINE>\n>>> quiet(e, e)\n>>> eat(rod)\nDON'T BE RIDICULOUS!\n<BLANKLINE>\n\n>>> quiet(restart(), get(bottle), leave, w)\n>>> drink\nTHE BOTTLE OF WATER IS NOW EMPTY.\n<BLANKLINE>\n>>> drink\nDRINK WHAT?\n<BLANKLINE>\n>>> drink(lamp)\nDON'T BE RIDICULOUS!\n<BLANKLINE>\n\n>>> quiet(restart())\n>>> rub(lamp)\nRUBBING THE ELECTRIC LAMP IS NOT PARTICULARLY REWARDING.  ANYWAY,\nNOTHING EXCITING HAPPENS.\n<BLANKLINE>\n>>> rub(bottle)\nI THINK I JUST LOST MY APPETITE.\n<BLANKLINE>\n\n>>> quiet(restart(objects=[axe]), get(axe))\n>>> throw(food)\nYOU AREN'T CARRYING IT!\n<BLANKLINE>\n>>> quiet(get(food), leave)\n>>> throw(lamp)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\nAROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\nDOWN A GULLY.\n<BLANKLINE>\nTHERE IS A LAMP SHINING NEARBY.\n<BLANKLINE>\n>>> quiet(get(lamp), go_to(130))\n>>> throw(axe)\nTHE AXE MISSES AND LANDS NEAR THE BEAR WHERE YOU CAN'T GET AT IT.\n<BLANKLINE>\n>>> get(axe)\nYOU CAN'T BE SERIOUS!\n<BLANKLINE>\n>>> throw(food)\nTHE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH HE SEEMS TO CALM\nDOWN CONSIDERABLY AND EVEN BECOMES RATHER FRIENDLY.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> quiet(leave)\n>>> throw(axe)\nTHERE IS NOTHING HERE TO ATTACK.\n<BLANKLINE>\n\n>>> restart()\n>>> quit()\nDO YOU REALLY WANT TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> quit()\nDO YOU REALLY WANT TO QUIT NOW?\n<BLANKLINE>\n>>> yes\nOK\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 61 OUT OF A POSSIBLE 350 USING 7 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 70 MORE POINTS\n<BLANKLINE>\n\n>>> restart()\n>>> find(lamp)\nYOU ARE ALREADY CARRYING IT!\n<BLANKLINE>\n>>> find(keys)\nI BELIEVE WHAT YOU WANT IS RIGHT HERE WITH YOU.\n<BLANKLINE>\n\n>>> quiet(restart(), get(food), get(keys), go_to(130), throw(food), unlock)\n>>> get(bear)\nOK\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\n\n>>> quiet(restart(dwarves=True), go_to(10), get(cage), go_to(13))\n>>> feed(bird)\nIT'S NOT HUNGRY (IT'S MERELY PININ' FOR THE FJORDS).  BESIDES, YOU\nHAVE NO BIRD SEED.\n<BLANKLINE>\n>>> quiet(get(bird), go_to(117))\n>>> feed(troll)\nGLUTTONY IS NOT ONE OF THE TROLL'S VICES.  AVARICE, HOWEVER, IS.\n<BLANKLINE>\n>>> quiet(go_to(119))\n>>> feed(dragon)\nTHERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHAPS YOU).\n<BLANKLINE>\n>>> quiet(kill(dragon), yes)\n>>> feed(dragon)\nDON'T BE RIDICULOUS!\n<BLANKLINE>\n>>> quiet(go_to(19))\n>>> feed(snake)\nTHE SNAKE HAS NOW DEVOURED YOUR BIRD.\n<BLANKLINE>\n>>> feed(snake)\nTHERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHAPS YOU).\n<BLANKLINE>\n>>> game.dwarf_stage = 2\n>>> quiet(look)\n>>> feed(dwarf)\nTHERE IS NOTHING HERE TO EAT.\n<BLANKLINE>\n>>> game.food.drop(game.loc)\n>>> feed(dwarf)\nYOU FOOL, DWARVES EAT ONLY COAL!  NOW YOU'VE MADE HIM *REALLY* MAD!!\n<BLANKLINE>\n>>> quiet(go_to(129), drop(food), e)\n>>> feed(bear)\nTHERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHAPS YOU).\n<BLANKLINE>\n>>> feed(chain)\nI'M GAME.  WOULD YOU CARE TO EXPLAIN HOW?\n<BLANKLINE>\n\n>>> quiet(restart(), get(bottle), drink)\n>>> fill\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> fill\nYOUR BOTTLE IS ALREADY FULL.\n<BLANKLINE>\n>>> quiet(drink, plugh)\n>>> fill\nTHERE IS NOTHING HERE WITH WHICH TO FILL THE BOTTLE.\n<BLANKLINE>\n>>> quiet(drop(bottle), go_to(97))\n>>> fill(vase)\nYOU CAN'T FILL THAT.\n<BLANKLINE>\n>>> quiet(get(vase))\n>>> fill(vase)\nTHERE IS NOTHING HERE WITH WHICH TO FILL THE VASE.\n<BLANKLINE>\n>>> quiet(go_to(38))\n>>> fill(vase)\nTHE SUDDEN CHANGE IN TEMPERATURE HAS DELICATELY SHATTERED THE VASE.\n<BLANKLINE>\n>>> look\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\nTHE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY.\n<BLANKLINE>\n>>> get(vase)\nYOU CAN'T BE SERIOUS!\n<BLANKLINE>\n>>> fill(lamp)\nYOU CAN'T FILL THAT.\n<BLANKLINE>\n>>> fill\nFILL WHAT?\n<BLANKLINE>\n\n>>> restart()\n>>> blast\nBLASTING REQUIRES DYNAMITE.\n<BLANKLINE>\n\n>>> restart()\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 57 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> yes\nOK\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 61 OUT OF A POSSIBLE 350 USING 6 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 70 MORE POINTS\n<BLANKLINE>\n\n>>> quiet(restart(), go_to(92), fee, fie, foe)\n>>> foo                         # does nothing obvious since the eggs are here\nOK\n<BLANKLINE>\n>>> quiet(get(eggs), go_to(117))\n>>> throw(eggs)\nTHE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGHT.\n<BLANKLINE>\n>>> quiet(fee, fie, foe)\n>>> foo\nDONE!\n<BLANKLINE>\n>>> cross                       # troll does not wait for us to cross!\nTHE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR WAY.\n<BLANKLINE>\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n\n>>> quiet(restart(), go_to(106))\n>>> read\nI'M AFRAID THE MAGAZINE IS WRITTEN IN DWARVISH.\n<BLANKLINE>\n>>> quiet(off)\n>>> read(magazine)\nI SEE NO MAGAZINE HERE.\n<BLANKLINE>\n>>> quiet(on, get(magazine), go_to(101))\n>>> read                        # confused by two choices\nREAD WHAT?\n<BLANKLINE>\n>>> read(tablet)\n\"CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-ROOM!\"\n<BLANKLINE>\n>>> quiet(go_to(95), get(trident), go_to(103), unlock(clam), get(oyster))\n>>> read(oyster)\nHMMM, THIS LOOKS LIKE A CLUE, WHICH MEANS IT'LL COST YOU 10 POINTS TO\nREAD IT.  SHOULD I GO AHEAD AND READ IT ANYWAY?\n<BLANKLINE>\n>>> yes\nIT SAYS, \"THERE IS SOMETHING STRANGE ABOUT THIS PLACE, SUCH THAT ONE\nOF THE WORDS I'VE ALWAYS KNOWN NOW HAS A NEW EFFECT.\"\n<BLANKLINE>\n>>> read(oyster)\nIT SAYS THE SAME THING IT DID BEFORE.\n<BLANKLINE>\n>>> quiet(go_to(29), get(gold), go_to(112))\n>>> game.pirate.room = game.rooms[112]\n>>> look\nOUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE!  \"HAR, HAR,\"\nHE CHORTLES, \"I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME\nCHEST DEEP IN THE MAZE!\"  HE SNATCHES YOUR TREASURE AND VANISHES INTO\nTHE GLOOM.\n<BLANKLINE>\nYOU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL DIFFERENT.\n<BLANKLINE>\n>>> s\nDEAD END\n<BLANKLINE>\nTHERE IS A MESSAGE SCRAWLED IN THE DUST IN A FLOWERY SCRIPT, READING:\n\"THIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHEST.\"\n<BLANKLINE>\nTHERE IS A MASSIVE VENDING MACHINE HERE.  THE INSTRUCTIONS ON IT READ:\n\"DROP COINS HERE TO RECEIVE FRESH BATTERIES.\"\n<BLANKLINE>\n>>> read(message)\n\"THIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHEST.\"\n<BLANKLINE>\n>>> read(lamp)\nI'M AFRAID I DON'T UNDERSTAND.\n<BLANKLINE>\n\n>>> quiet(restart(), go_to(97))\n>>> smash(vase)\nYOU HAVE TAKEN THE VASE AND HURLED IT DELICATELY TO THE GROUND.\n<BLANKLINE>\n>>> get(vase)\nYOU CAN'T BE SERIOUS!\n<BLANKLINE>\n>>> quiet(restart(), go_to(97))\n>>> get(vase)                   # can we also break it while carrying it?\nOK\n<BLANKLINE>\n>>> smash(vase)\nYOU HAVE TAKEN THE VASE AND HURLED IT DELICATELY TO THE GROUND.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\n<BLANKLINE>\n>>> look\nTHIS IS THE ORIENTAL ROOM.  ANCIENT ORIENTAL CAVE DRAWINGS COVER THE\nWALLS.  A GENTLY SLOPING PASSAGE LEADS UPWARD TO THE NORTH, ANOTHER\nPASSAGE LEADS SE, AND A HANDS AND KNEES CRAWL LEADS WEST.\n<BLANKLINE>\nTHE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY.\n<BLANKLINE>\n>>> quiet(go_to(109))\n>>> smash(mirror)\nIT IS TOO FAR UP FOR YOU TO REACH.\n<BLANKLINE>\n>>> smash(lamp)\nIT IS BEYOND YOUR POWER TO DO THAT.\n<BLANKLINE>\n\n>>> quiet(restart())\n>>> wake(keys)\nDON'T BE RIDICULOUS!\n<BLANKLINE>\n\n>>> quiet(restart())\n>>> suspend\nPROVIDE \"SUSPEND\" WITH A FILENAME OR OPEN FILE\n<BLANKLINE>\n\n----------------\nClosing the cave\n----------------\n\nFinally, there are a few situations we need to test that relate\nspecifically to the end-game.  For example, dying while the cave is\nclosing causes a very abrupt ending to the game.\n\n>>> quiet(restart(), drop(lamp), go_to(13))\n>>> game.is_closing = 1\n>>> game.start_closing_cave()\n>>> w\nYOU FELL INTO A PIT AND BROKE EVERY BONE IN YOUR BODY!\n<BLANKLINE>\nIT LOOKS AS THOUGH YOU'RE DEAD.  WELL, SEEING AS HOW IT'S SO CLOSE TO\nCLOSING TIME ANYWAY, I THINK WE'LL JUST CALL IT A DAY.\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 78 OUT OF A POSSIBLE 350 USING 7 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 53 MORE POINTS\n<BLANKLINE>\n\nNow we reload our saved game one last time, take it through the ending,\nand then save anew so that we can do several tests in the repository.\n\n>>> quiet(restart(), get(keys), go_to(9))\n>>> game.is_closing = 1\n>>> game.start_closing_cave()\n>>> unlock\nA MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES:\n   \"THIS EXIT IS CLOSED.  PLEASE LEAVE VIA MAIN OFFICE.\"\n<BLANKLINE>\n>>> game.clock2 = 1\n>>> w\nTHE SEPULCHRAL VOICE ENTONES, \"THE CAVE IS NOW CLOSED.\"  AS THE ECHOES\nFADE, THERE IS A BLINDING FLASH OF LIGHT (AND A SMALL PUFF OF ORANGE\nSMOKE). . . .    AS YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND...\n<BLANKLINE>\nYOU'RE AT NE END.\n<BLANKLINE>\n>>> quiet(savefile.truncate())\n>>> savefile.seek(0)\n0\n>>> save(savefile)\nGAME SAVED\n<BLANKLINE>\n\nMost of the interesting end-game events are fatal, but not all.\n\n>>> quiet(restart(), sw)\n>>> get(cage)\nOK\n<BLANKLINE>\n>>> attack(bird)\nOH, LEAVE THE POOR UNHAPPY BIRD ALONE.\n<BLANKLINE>\n>>> drop(bird)\nTHE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN ASTOUNDING FLURRY\nDRIVES THE SNAKE AWAY.\n<BLANKLINE>\nTHE RESULTING RUCKUS HAS AWAKENED THE DWARVES.  THERE ARE NOW SEVERAL\nTHREATENING LITTLE DWARVES IN THE ROOM WITH YOU!  MOST OF THEM THROW\nKNIVES AT YOU!  ALL OF THEM GET YOU!\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 98 OUT OF A POSSIBLE 350 USING 13 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 33 MORE POINTS\n<BLANKLINE>\n\n>>> quiet(restart())\n>>> attack(dwarf)\nTHE RESULTING RUCKUS HAS AWAKENED THE DWARVES.  THERE ARE NOW SEVERAL\nTHREATENING LITTLE DWARVES IN THE ROOM WITH YOU!  MOST OF THEM THROW\nKNIVES AT YOU!  ALL OF THEM GET YOU!\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 98 OUT OF A POSSIBLE 350 USING 10 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 33 MORE POINTS\n<BLANKLINE>\n\n>>> quiet(restart(), sw)\n>>> get(rod)                    # grab the rusty-mark rod\nOK\n<BLANKLINE>\n>>> ne                          # move to where the rusty-star rods lie\nYOU'RE AT NE END.\n<BLANKLINE>\n>>> throw(rod)                  # will the correct rod get dropped?\nOK\n<BLANKLINE>\n>>> look\nYOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE\nGIANT ROOM.  IT APPEARS TO BE A REPOSITORY FOR THE \"ADVENTURE\"\nPROGRAM.  MASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY\nYELLOW LIGHT.  SCATTERED ABOUT YOU CAN BE SEEN A PILE OF BOTTLES (ALL\nOF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED\nOF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND\nA COLLECTION OF BRASS LANTERNS.  OFF TO ONE SIDE A GREAT MANY DWARVES\nARE SLEEPING ON THE FLOOR, SNORING LOUDLY.  A SIGN NEARBY READS: \"DO\nNOT DISTURB THE DWARVES!\"  AN IMMENSE MIRROR IS HANGING AGAINST ONE\nWALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER\nSUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANCE.\n<BLANKLINE>\nA THREE FOOT BLACK ROD WITH A RUSTY MARK ON AN END LIES NEARBY.\n<BLANKLINE>\n\n>>> restart()\n>>> find(eggs)\nI DARESAY WHATEVER YOU WANT IS AROUND HERE SOMEWHERE.\n<BLANKLINE>\n>>> sw\nYOU'RE AT SW END.\n<BLANKLINE>\n>>> get(rod)\nOK\n<BLANKLINE>\n>>> blast\nTHERE IS A LOUD EXPLOSION, AND YOU ARE SUDDENLY SPLASHED ACROSS THE\nWALLS OF THE ROOM.\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 113 OUT OF A POSSIBLE 350 USING 13 TURNS.\n<BLANKLINE>\nYOU HAVE ACHIEVED THE RATING: \"EXPERIENCED ADVENTURER\".\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 88 MORE POINTS\n<BLANKLINE>\n\n>>> restart()\n>>> shatter(mirror)\nYOU STRIKE THE MIRROR A RESOUNDING BLOW, WHEREUPON IT SHATTERS INTO A\nMYRIAD TINY FRAGMENTS.\n<BLANKLINE>\nTHE RESULTING RUCKUS HAS AWAKENED THE DWARVES.  THERE ARE NOW SEVERAL\nTHREATENING LITTLE DWARVES IN THE ROOM WITH YOU!  MOST OF THEM THROW\nKNIVES AT YOU!  ALL OF THEM GET YOU!\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 98 OUT OF A POSSIBLE 350 USING 10 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 33 MORE POINTS\n<BLANKLINE>\n\n>>> restart()\n>>> wake(dwarves)\nYOU PROD THE NEAREST DWARF, WHO WAKES UP GRUMPILY, TAKES ONE LOOK AT\nYOU, CURSES, AND GRABS FOR HIS AXE.\n<BLANKLINE>\nTHE RESULTING RUCKUS HAS AWAKENED THE DWARVES.  THERE ARE NOW SEVERAL\nTHREATENING LITTLE DWARVES IN THE ROOM WITH YOU!  MOST OF THEM THROW\nKNIVES AT YOU!  ALL OF THEM GET YOU!\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 98 OUT OF A POSSIBLE 350 USING 10 TURNS.\n<BLANKLINE>\nYOUR SCORE QUALIFIES YOU AS A NOVICE CLASS ADVENTURER.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 33 MORE POINTS\n<BLANKLINE>\n"
  },
  {
    "path": "adventure/tests/walkthrough1.txt",
    "content": ">>> import adventure\n>>> adventure.play(seed=1)\nWELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?\n<BLANKLINE>\n>>> yes\nSOMEWHERE NEARBY IS COLOSSAL CAVE, WHERE OTHERS HAVE FOUND FORTUNES IN\nTREASURE AND GOLD, THOUGH IT IS RUMORED THAT SOME WHO ENTER ARE NEVER\nSEEN AGAIN.  MAGIC IS SAID TO WORK IN THE CAVE.  I WILL BE YOUR EYES\nAND HANDS.  DIRECT ME WITH COMMANDS OF 1 OR 2 WORDS.  I SHOULD WARN\nYOU THAT I LOOK AT ONLY THE FIRST FIVE LETTERS OF EACH WORD, SO YOU'LL\nHAVE TO ENTER \"NORTHEAST\" AS \"NE\" TO DISTINGUISH IT FROM \"NORTH\".\n(SHOULD YOU GET STUCK, TYPE \"HELP\" FOR SOME GENERAL HINTS.  FOR INFOR-\nMATION ON HOW TO END YOUR ADVENTURE, ETC., TYPE \"INFO\".)\n                              - - -\nTHIS PROGRAM WAS ORIGINALLY DEVELOPED BY WILLIE CROWTHER.  MOST OF THE\nFEATURES OF THE CURRENT PROGRAM WERE ADDED BY DON WOODS (DON @ SU-AI).\nCONTACT DON IF YOU HAVE ANY QUESTIONS, COMMENTS, ETC.\n<BLANKLINE>\nYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\nAROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\nDOWN A GULLY.\n<BLANKLINE>\n>>> cave\nI DON'T KNOW WHERE THE CAVE IS, BUT HEREABOUTS NO STREAM CAN RUN ON\nTHE SURFACE FOR LONG.  I WOULD TRY THE STREAM.\n<BLANKLINE>\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\n>>> inven()\nYOU'RE NOT CARRYING ANYTHING.\n<BLANKLINE>\n>>> west\nYOU HAVE WALKED UP A HILL, STILL IN THE FOREST.  THE ROAD SLOPES BACK\nDOWN THE OTHER SIDE OF THE HILL.  THERE IS A BUILDING IN THE DISTANCE.\n<BLANKLINE>\n>>> e\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\n>>> e\nYOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> downs\nTHE STREAM FLOWS OUT THROUGH A PAIR OF 1 FOOT DIAMETER SEWER PIPES.\nIT WOULD BE ADVISABLE TO USE THE EXIT.\n<BLANKLINE>\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> west\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\n>>> s\nYOU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A\nROCKY BED.\n<BLANKLINE>\n>>> s\nAT YOUR FEET ALL THE WATER OF THE STREAM SPLASHES INTO A 2-INCH SLIT\nIN THE ROCK.  DOWNSTREAM THE STREAMBED IS BARE ROCK.\n<BLANKLINE>\n>>> s\nYOU ARE IN A 20-FOOT DEPRESSION FLOORED WITH BARE DIRT.  SET INTO THE\nDIRT IS A STRONG STEEL GRATE MOUNTED IN CONCRETE.  A DRY STREAMBED\nLEADS INTO THE DEPRESSION.\n<BLANKLINE>\nTHE GRATE IS LOCKED.\n<BLANKLINE>\n>>> d\nYOU CAN'T GO THROUGH A LOCKED STEEL GRATE!\n<BLANKLINE>\nYOU'RE OUTSIDE GRATE.\n<BLANKLINE>\nTHE GRATE IS LOCKED.\n<BLANKLINE>\n>>> get(grate)\nYOU CAN'T BE SERIOUS!\n<BLANKLINE>\n>>> enter\nYOU CAN'T GO THROUGH A LOCKED STEEL GRATE!\n<BLANKLINE>\nYOU'RE OUTSIDE GRATE.\n<BLANKLINE>\nTHE GRATE IS LOCKED.\n<BLANKLINE>\nARE YOU TRYING TO GET INTO THE CAVE?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> house\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\n>>> enter\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> carry(keys)\nOK\n<BLANKLINE>\n>>> inven\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\n<BLANKLINE>\n>>> leave\nYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\nAROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\nDOWN A GULLY.\n<BLANKLINE>\n>>> depre\nYOU'RE OUTSIDE GRATE.\n<BLANKLINE>\nTHE GRATE IS LOCKED.\n<BLANKLINE>\n>>> unloc(grate)\nTHE GRATE IS NOW UNLOCKED.\n<BLANKLINE>\n>>> d\nYOU ARE IN A SMALL CHAMBER BENEATH A 3X3 STEEL GRATE TO THE SURFACE.\nA LOW CRAWL OVER COBBLES LEADS INWARD TO THE WEST.\n<BLANKLINE>\nTHE GRATE IS OPEN.\n<BLANKLINE>\n>>> s\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE BELOW THE GRATE.\n<BLANKLINE>\nTHE GRATE IS OPEN.\n<BLANKLINE>\n>>> west\nYOU ARE CRAWLING OVER COBBLES IN A LOW PASSAGE.  THERE IS A DIM LIGHT\nAT THE EAST END OF THE PASSAGE.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\n>>> take(cage)\nOK\n<BLANKLINE>\n>>> west\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> west\nYOU FELL INTO A PIT AND BROKE EVERY BONE IN YOUR BODY!\n<BLANKLINE>\nOH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED.  I MIGHT BE ABLE TO\nHELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS BEFORE.  DO YOU WANT ME\nTO TRY TO REINCARNATE YOU?\n<BLANKLINE>\n>>> save\nPLEASE ANSWER THE QUESTION.\n<BLANKLINE>\n>>> yes\nALL RIGHT.  BUT DON'T BLAME ME IF SOMETHING GOES WR......\n                    --- POOF!! ---\nYOU ARE ENGULFED IN A CLOUD OF ORANGE SMOKE.  COUGHING AND GASPING,\nYOU EMERGE FROM THE SMOKE AND FIND....\n<BLANKLINE>\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> leave\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\n>>> depre\nYOU'RE OUTSIDE GRATE.\n<BLANKLINE>\nTHE GRATE IS OPEN.\n<BLANKLINE>\n>>> d\nYOU'RE BELOW THE GRATE.\n<BLANKLINE>\nTHE GRATE IS OPEN.\n<BLANKLINE>\n>>> west\nYOU'RE IN COBBLE CRAWL.\n<BLANKLINE>\n>>> west\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> light(lamp)\nYOUR LAMP IS NOW ON.\n<BLANKLINE>\nYOU ARE IN A DEBRIS ROOM FILLED WITH STUFF WASHED IN FROM THE SURFACE.\nA LOW WIDE PASSAGE WITH COBBLES BECOMES PLUGGED WITH MUD AND DEBRIS\nHERE, BUT AN AWKWARD CANYON LEADS UPWARD AND WEST.  A NOTE ON THE WALL\nSAYS \"MAGIC WORD XYZZY\".\n<BLANKLINE>\nA THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARBY.\n<BLANKLINE>\n>>> get(rod)\nOK\n<BLANKLINE>\n>>> up\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\n>>> get(keys)\nOK\n<BLANKLINE>\n>>> u\nYOU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH.  THE WALLS ARE FROZEN\nRIVERS OF ORANGE STONE.  AN AWKWARD CANYON AND A GOOD PASSAGE EXIT\nFROM EAST AND WEST SIDES OF THE CHAMBER.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> get(bird)\nTHE BIRD WAS UNAFRAID WHEN YOU ENTERED, BUT AS YOU APPROACH IT BECOMES\nDISTURBED AND YOU CANNOT CATCH IT.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nBLACK ROD\n<BLANKLINE>\n>>> drop(rod)\nOK\n<BLANKLINE>\n>>> inven\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\n<BLANKLINE>\n>>> get(bird)\nYOU CAN CATCH THE BIRD, BUT YOU CANNOT CARRY IT.\n<BLANKLINE>\n>>> e\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\n>>> get(cage)\nOK\n<BLANKLINE>\n>>> west\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\nA THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARBY.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> get(bird)\nOK\n<BLANKLINE>\n>>> get(rod)\nOK\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nYOU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH.  THE WALLS ARE FROZEN\nRIVERS OF ORANGE STONE.  AN AWKWARD CANYON AND A GOOD PASSAGE EXIT\nFROM EAST AND WEST SIDES OF THE CHAMBER.\n<BLANKLINE>\n>>> west\nAT YOUR FEET IS A SMALL PIT BREATHING TRACES OF WHITE MIST.  AN EAST\nPASSAGE ENDS HERE EXCEPT FOR A SMALL CRACK LEADING ON.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> west\nIF YOU PREFER, SIMPLY TYPE W RATHER THAN WEST.\n<BLANKLINE>\nTHE CRACK IS FAR TOO SMALL FOR YOU TO FOLLOW.\n<BLANKLINE>\nYOU'RE AT TOP OF SMALL PIT.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nAT YOUR FEET IS A SMALL PIT BREATHING TRACES OF WHITE MIST.  AN EAST\nPASSAGE ENDS HERE EXCEPT FOR A SMALL CRACK LEADING ON.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> d\nYOU ARE AT ONE END OF A VAST HALL STRETCHING FORWARD OUT OF SIGHT TO\nTHE WEST.  THERE ARE OPENINGS TO EITHER SIDE.  NEARBY, A WIDE STONE\nSTAIRCASE LEADS DOWNWARD.  THE HALL IS FILLED WITH WISPS OF WHITE MIST\nSWAYING TO AND FRO ALMOST AS IF ALIVE.  A COLD WIND BLOWS UP THE\nSTAIRCASE.  THERE IS A PASSAGE AT THE TOP OF A DOME BEHIND YOU.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> w\nYOU ARE ON THE EAST BANK OF A FISSURE SLICING CLEAR ACROSS THE HALL.\nTHE MIST IS QUITE THICK HERE, AND THE FISSURE IS TOO WIDE TO JUMP.\n<BLANKLINE>\n>>> w\nTHERE IS NO WAY ACROSS THE FISSURE.\n<BLANKLINE>\nYOU'RE ON EAST BANK OF FISSURE.\n<BLANKLINE>\n>>> e\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> n\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\nA HUGE GREEN FIERCE SNAKE BARS THE WAY!\n<BLANKLINE>\n>>> s\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA HUGE GREEN FIERCE SNAKE BARS THE WAY!\n<BLANKLINE>\n>>> up\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> down\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA HUGE GREEN FIERCE SNAKE BARS THE WAY!\n<BLANKLINE>\n>>> kill(snake)\nATTACKING THE SNAKE BOTH DOESN'T WORK AND IS VERY DANGEROUS.\n<BLANKLINE>\n>>> drop(cage)\nOK\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nTHERE IS A LITTLE BIRD IN THE CAGE.\n<BLANKLINE>\nA HUGE GREEN FIERCE SNAKE BARS THE WAY!\n<BLANKLINE>\n>>> get(bird)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\nA HUGE GREEN FIERCE SNAKE BARS THE WAY!\n<BLANKLINE>\n>>> inven\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nWICKER CAGE\nBLACK ROD\nLITTLE BIRD IN CAGE\n<BLANKLINE>\n>>> drop(bird)\nTHE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN ASTOUNDING FLURRY\nDRIVES THE SNAKE AWAY.\n<BLANKLINE>\n>>> look\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 42 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> s\nA LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE\nAXE AT YOU WHICH MISSED, CURSED, AND RAN AWAY.\n<BLANKLINE>\nYOU ARE IN THE SOUTH SIDE CHAMBER.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 44 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> get(jewelry)\nOK\n<BLANKLINE>\n>>> n\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> w\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF THE MOUNTAIN KING.\nA PASSAGE CONTINUES WEST AND UP HERE.\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 46 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> get(coins)\nOK\n<BLANKLINE>\n>>> w\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\nYOU ARE AT A CROSSOVER OF A HIGH N/S PASSAGE AND A LOW E/W ONE.\n<BLANKLINE>\n>>> n\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\n>>> s\nA LITTLE DWARF WITH A BIG KNIFE BLOCKS YOUR WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU KILLED A LITTLE DWARF.  THE BODY VANISHES IN A CLOUD OF GREASY\nBLACK SMOKE.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU KILLED A LITTLE DWARF.\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> s\nYOU ARE AT A CROSSOVER OF A HIGH N/S PASSAGE AND A LOW E/W ONE.\n<BLANKLINE>\n>>> w\nYOU ARE AT THE EAST END OF A VERY LONG HALL APPARENTLY WITHOUT SIDE\nCHAMBERS.  TO THE EAST A LOW WIDE CRAWL SLANTS UP.  TO THE NORTH A\nROUND TWO FOOT HOLE SLANTS DOWN.\n<BLANKLINE>\n>>> w\nYOU ARE AT THE WEST END OF A VERY LONG FEATURELESS HALL.  THE HALL\nJOINS UP WITH A NARROW NORTH/SOUTH PASSAGE.\n<BLANKLINE>\n>>> n\nYOU ARE AT A CROSSOVER OF A HIGH N/S PASSAGE AND A LOW E/W ONE.\n<BLANKLINE>\n>>> n\nDEAD END\n<BLANKLINE>\n>>> back\nYOU ARE AT A CROSSOVER OF A HIGH N/S PASSAGE AND A LOW E/W ONE.\n<BLANKLINE>\n>>> w\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\n>>> e\nYOU ARE AT THE WEST END OF HALL OF MISTS.  A LOW WIDE CRAWL CONTINUES\nWEST AND ANOTHER GOES NORTH.  TO THE SOUTH IS A LITTLE PASSAGE 6 FEET\nOFF THE FLOOR.\n<BLANKLINE>\n>>> e\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\n>>> get(diamonds)\nYOU CAN'T CARRY ANYTHING MORE.  YOU'LL HAVE TO DROP SOMETHING FIRST.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nWICKER CAGE\nBLACK ROD\nDWARF'S AXE\nPRECIOUS JEWELRY\nRARE COINS\n<BLANKLINE>\n>>> drop(cage)\nOK\n<BLANKLINE>\n>>> get(diamonds)\nOK\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH\nOF THE HALL OF MISTS.\n<BLANKLINE>\nYOU'RE AT WEST END OF HALL OF MISTS.\n<BLANKLINE>\n>>> w\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nYOU ARE AT THE EAST END OF A VERY LONG HALL APPARENTLY WITHOUT SIDE\nCHAMBERS.  TO THE EAST A LOW WIDE CRAWL SLANTS UP.  TO THE NORTH A\nROUND TWO FOOT HOLE SLANTS DOWN.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE ARE 2 THREATENING LITTLE DWARVES IN THE ROOM WITH YOU.\n<BLANKLINE>\n2 OF THEM THROW KNIVES AT YOU!\n<BLANKLINE>\nNONE OF THEM HIT YOU!\n<BLANKLINE>\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU KILLED A LITTLE DWARF.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU ARE AT THE EAST END OF A VERY LONG HALL APPARENTLY WITHOUT SIDE\nCHAMBERS.  TO THE EAST A LOW WIDE CRAWL SLANTS UP.  TO THE NORTH A\nROUND TWO FOOT HOLE SLANTS DOWN.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT GETS YOU!\n<BLANKLINE>\nYOU CLUMSY OAF, YOU'VE DONE IT AGAIN!  I DON'T KNOW HOW LONG I CAN\nKEEP THIS UP.  DO YOU WANT ME TO TRY REINCARNATING YOU AGAIN?\n<BLANKLINE>\n>>> get(axe)\nPLEASE ANSWER THE QUESTION.\n<BLANKLINE>\n>>> yes\nOKAY, NOW WHERE DID I PUT MY ORANGE SMOKE?....  >POOF!<\nEVERYTHING DISAPPEARS IN A DENSE CLOUD OF ORANGE SMOKE.\n<BLANKLINE>\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> leave\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> enter\nYOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> xyzzy\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n\n>>> import io\n>>> savefile = io.BytesIO()\n>>> save(savefile)\nGAME SAVED\n<BLANKLINE>\n\n>>> w\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> w\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> w\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> w\nTHE CRACK IS FAR TOO SMALL FOR YOU TO FOLLOW.\n<BLANKLINE>\nYOU FELL INTO A PIT AND BROKE EVERY BONE IN YOUR BODY!\n<BLANKLINE>\nNOW YOU'VE REALLY DONE IT!  I'M OUT OF ORANGE SMOKE!  YOU DON'T EXPECT\nME TO DO A DECENT REINCARNATION WITHOUT ANY ORANGE SMOKE, DO YOU?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 32 OUT OF A POSSIBLE 350 USING 132 TURNS.\n<BLANKLINE>\nYOU ARE OBVIOUSLY A RANK AMATEUR.  BETTER LUCK NEXT TIME.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 69 MORE POINTS\n<BLANKLINE>\n>>> w\nYOU HAVE GOTTEN YOURSELF KILLED.\n<BLANKLINE>\n\n>>> savefile.seek(0)\n0\n>>> adventure.resume(savefile)\nGAME RESTORED\n<BLANKLINE>\n\n>>> on(lamp)\nYOUR LAMP IS NOW ON.\n<BLANKLINE>\nYOU'RE IN DEBRIS ROOM.\n<BLANKLINE>\n>>> w\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> w\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\n>>> w\nYOU'RE AT TOP OF SMALL PIT.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> d\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> d\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> w\nYOU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF THE MOUNTAIN KING.\nA PASSAGE CONTINUES WEST AND UP HERE.\n<BLANKLINE>\n>>> w\nYOU ARE AT A CROSSOVER OF A HIGH N/S PASSAGE AND A LOW E/W ONE.\n<BLANKLINE>\n>>> w\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nA THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARBY.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> get(keys)\nOK\n<BLANKLINE>\n>>> get(rod)\nOK\n<BLANKLINE>\n>>> get(diamonds)\nOK\n<BLANKLINE>\n>>> get(jewel)\nOK\n<BLANKLINE>\n>>> get(coins)\nOK\n<BLANKLINE>\n>>> e\nYOU'RE AT WEST END OF HALL OF MISTS.\n<BLANKLINE>\n>>> e\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\n>>> jump\nI DON'T KNOW HOW TO APPLY THAT WORD HERE.\n<BLANKLINE>\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\n>>> swing(rod)\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> look\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> jump\nI RESPECTFULLY SUGGEST YOU GO ACROSS THE BRIDGE INSTEAD OF JUMPING.\n<BLANKLINE>\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> over\nYOU'RE ON EAST BANK OF FISSURE.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> e\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> s\nTHIS IS A LOW ROOM WITH A CRUDE NOTE ON THE WALL.  THE NOTE SAYS,\n\"YOU WON'T GET IT UP THE STEPS\".\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\n>>> get(gold)\nYOU CAN'T CARRY ANYTHING MORE.  YOU'LL HAVE TO DROP SOMETHING FIRST.\n<BLANKLINE>\n>>> drop(rod)\nOK\n<BLANKLINE>\n>>> get(gold)\nOK\n<BLANKLINE>\n>>> n\nYOU ARE AT ONE END OF A VAST HALL STRETCHING FORWARD OUT OF SIGHT TO\nTHE WEST.  THERE ARE OPENINGS TO EITHER SIDE.  NEARBY, A WIDE STONE\nSTAIRCASE LEADS DOWNWARD.  THE HALL IS FILLED WITH WISPS OF WHITE MIST\nSWAYING TO AND FRO ALMOST AS IF ALIVE.  A COLD WIND BLOWS UP THE\nSTAIRCASE.  THERE IS A PASSAGE AT THE TOP OF A DOME BEHIND YOU.\n<BLANKLINE>\n>>> u\nTHE DOME IS UNCLIMBABLE.\n<BLANKLINE>\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\n>>> drop(gold)\nOK\n<BLANKLINE>\n>>> u\nYOU'RE AT TOP OF SMALL PIT.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> e\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\n>>> e\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> e\nYOU'RE IN DEBRIS ROOM.\n<BLANKLINE>\n>>> xyzzy\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 40 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nDWARF'S AXE\nSEVERAL DIAMONDS\nPRECIOUS JEWELRY\nRARE COINS\n<BLANKLINE>\n>>> drop(diamonds)\nOK\n<BLANKLINE>\n>>> drop(jewelry)\nOK\n<BLANKLINE>\n>>> drop(coins)\nOK\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 70 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> xyzzy\nYOU'RE IN DEBRIS ROOM.\n<BLANKLINE>\n>>> w\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> w\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\n>>> w\nYOU'RE AT TOP OF SMALL PIT.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> d\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\n>>> get(gold)\nOK\n<BLANKLINE>\n>>> n\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> n\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> get(silver)\nOK\n<BLANKLINE>\n>>> n\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\n>>> w\nYOU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF\nSIGHT.  A FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW.  TRACES OF\nWHITE MIST COVER THE FLOOR OF THE PIT, BECOMING THICKER TO THE RIGHT.\nMARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT\nSOMEONE HAS BEEN HERE RECENTLY.  DIRECTLY ACROSS THE PIT FROM YOU AND\n25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM.  A\nSHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU.\n<BLANKLINE>\nTHE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT YOUR ATTENTION.\n<BLANKLINE>\n>>> wave\nWAVE WHAT?\n<BLANKLINE>\n>>> e\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> e\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> e\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> d\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> s\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> nw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> ne\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> se\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> sw\nYOU ARE IN A SECRET CANYON WHICH HERE RUNS E/W.  IT CROSSES OVER A\nVERY TIGHT CANYON 15 FEET BELOW.  IF YOU GO DOWN YOU MAY NOT BE ABLE\nTO GET BACK UP.\n<BLANKLINE>\n>>> w\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nA HUGE GREEN FIERCE DRAGON BARS THE WAY!\n<BLANKLINE>\nTHE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!!\n<BLANKLINE>\n>>> w\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nA HUGE GREEN FIERCE DRAGON BARS THE WAY!\n<BLANKLINE>\nTHE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!!\n<BLANKLINE>\n>>> e\nYOU'RE IN SECRET E/W CANYON ABOVE TIGHT CANYON.\n<BLANKLINE>\n>>> e\nOUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE!  \"HAR, HAR,\"\nHE CHORTLES, \"I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME\nCHEST DEEP IN THE MAZE!\"  HE SNATCHES YOUR TREASURE AND VANISHES INTO\nTHE GLOOM.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nDWARF'S AXE\n<BLANKLINE>\n>>> get(bird)\nYOU CAN CATCH THE BIRD, BUT YOU CANNOT CARRY IT.\n<BLANKLINE>\n>>> u\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> w\nYOU'RE ON EAST BANK OF FISSURE.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> w\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> get(cage)\nOK\n<BLANKLINE>\n>>> e\nYOU'RE ON EAST BANK OF FISSURE.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> e\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> d\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> get(bird)\nOK\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\n>>> sw\nYOU'RE IN SECRET E/W CANYON ABOVE TIGHT CANYON.\n<BLANKLINE>\n>>> w\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nA HUGE GREEN FIERCE DRAGON BARS THE WAY!\n<BLANKLINE>\nTHE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!!\n<BLANKLINE>\n>>> drop(bird)\nTHE LITTLE BIRD ATTACKS THE GREEN DRAGON, AND IN AN ASTOUNDING FLURRY\nGETS BURNT TO A CINDER.  THE ASHES BLOW AWAY.\n<BLANKLINE>\n>>> n\nTHE DRAGON LOOKS RATHER NASTY.  YOU'D BEST NOT TRY TO GET BY.\n<BLANKLINE>\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nA HUGE GREEN FIERCE DRAGON BARS THE WAY!\n<BLANKLINE>\nTHE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!!\n<BLANKLINE>\n>>> kill(dragon)\nWITH WHAT?  YOUR BARE HANDS?\n<BLANKLINE>\n>>> throw(axe)\nTHE AXE BOUNCES HARMLESSLY OFF THE DRAGON'S THICK SCALES.\n<BLANKLINE>\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nA HUGE GREEN FIERCE DRAGON BARS THE WAY!\n<BLANKLINE>\nTHE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!!\n<BLANKLINE>\n>>> yes\nI DON'T KNOW THAT WORD.\n<BLANKLINE>\n>>> kill(dragon)\nWITH WHAT?  YOUR BARE HANDS?\n<BLANKLINE>\n>>> yes\nCONGRATULATIONS!  YOU HAVE JUST VANQUISHED A DRAGON WITH YOUR BARE\nHANDS!  (UNBELIEVABLE, ISN'T IT?)\n<BLANKLINE>\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nTHE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SIDE.\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> get(dragon)\nYOU CAN'T BE SERIOUS!\n<BLANKLINE>\n>>> get(rug)\nOK\n<BLANKLINE>\n>>> n\nYOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM.\n<BLANKLINE>\n>>> n\nYOU ARE IN A NORTH/SOUTH CANYON ABOUT 25 FEET ACROSS.  THE FLOOR IS\nCOVERED BY WHITE MIST SEEPING IN FROM THE NORTH.  THE WALLS EXTEND\nUPWARD FOR WELL OVER 100 FEET.  SUSPENDED FROM SOME UNSEEN POINT FAR\nABOVE YOU, AN ENORMOUS TWO-SIDED MIRROR IS HANGING PARALLEL TO AND\nMIDWAY BETWEEN THE CANYON WALLS.  (THE MIRROR IS OBVIOUSLY PROVIDED\nFOR THE USE OF THE DWARVES, WHO AS YOU KNOW, ARE EXTREMELY VAIN.)  A\nSMALL WINDOW CAN BE SEEN IN EITHER WALL, SOME FIFTY FEET UP.\n<BLANKLINE>\n>>> n\nYOU ARE AT THE EDGE OF A LARGE UNDERGROUND RESERVOIR.  AN OPAQUE CLOUD\nOF WHITE MIST FILLS THE ROOM AND RISES RAPIDLY UPWARD.  THE LAKE IS\nFED BY A STREAM, WHICH TUMBLES OUT OF A HOLE IN THE WALL ABOUT 10 FEET\nOVERHEAD AND SPLASHES NOISILY INTO THE WATER SOMEWHERE WITHIN THE\nMIST.  THE ONLY PASSAGE GOES BACK TOWARD THE SOUTH.\n<BLANKLINE>\n>>> s\nYOU'RE IN MIRROR CANYON.\n<BLANKLINE>\n>>> s\nYOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM.\n<BLANKLINE>\n>>> s\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nTHE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SIDE.\n<BLANKLINE>\n>>> e\nYOU'RE IN SECRET E/W CANYON ABOVE TIGHT CANYON.\n<BLANKLINE>\n>>> e\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> n\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> w\nYOU'RE AT WINDOW ON PIT.\n<BLANKLINE>\nTHE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT YOUR ATTENTION.\n<BLANKLINE>\n>>> e\nYOU'RE AT \"Y2\".\n<BLANKLINE>\nA HOLLOW VOICE SAYS \"PLUGH\".\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nWICKER CAGE\nDWARF'S AXE\nPERSIAN RUG\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 74 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> n\nOK\n<BLANKLINE>\n>>> drop(persian)\nOK\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 88 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> n\nOK\n<BLANKLINE>\n>>> plugh\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> d\nYOU ARE IN A DIRTY BROKEN PASSAGE.  TO THE EAST IS A CRAWL.  TO THE\nWEST IS A LARGE PASSAGE.  ABOVE YOU IS A HOLE TO ANOTHER PASSAGE.\n<BLANKLINE>\n>>> e\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> d\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\n>>> u\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> w\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> w\nYOU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS.  THERE IS A BIG HOLE IN\nTHE FLOOR.  THERE ARE CRACKS EVERYWHERE, AND A PASSAGE LEADING EAST.\n<BLANKLINE>\n>>> d\nYOU ARE AT A COMPLEX JUNCTION.  A LOW HANDS AND KNEES PASSAGE FROM THE\nNORTH JOINS A HIGHER CRAWL FROM THE EAST TO MAKE A WALKING PASSAGE\nGOING WEST.  THERE IS ALSO A LARGE ROOM ABOVE.  THE AIR IS DAMP HERE.\n<BLANKLINE>\n>>> n\nYOU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY ROCK.  THE FLOOR AND\nWALLS ARE LITTERED WITH BITS OF SHELLS IMBEDDED IN THE STONE.  A\nSHALLOW PASSAGE PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEADS\nUP.  A LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SOUTH.\n<BLANKLINE>\nTHERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED.\n<BLANKLINE>\n>>> u\nYOU ARE IN AN ARCHED HALL.  A CORAL PASSAGE ONCE CONTINUED UP AND EAST\nFROM HERE, BUT IS NOW BLOCKED BY DEBRIS.  THE AIR SMELLS OF SEA WATER.\n<BLANKLINE>\n>>> d\nYOU'RE IN SHELL ROOM.\n<BLANKLINE>\nTHERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS.\n<BLANKLINE>\n>>> d\nYOU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET ACROSS.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS.\n<BLANKLINE>\n>>> u\nYOU'RE IN SHELL ROOM.\n<BLANKLINE>\nTHERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED.\n<BLANKLINE>\n>>> get(clam)\nOK\n<BLANKLINE>\n>>> s\nYOU CAN'T FIT THIS FIVE-FOOT CLAM THROUGH THAT LITTLE PASSAGE!\n<BLANKLINE>\nYOU'RE IN SHELL ROOM.\n<BLANKLINE>\n>>> drop(clam)\nOK\n<BLANKLINE>\n>>> unlock(clam)\nYOU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE CLAM.\n<BLANKLINE>\n>>> s\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> e\nYOU ARE IN AN ANTEROOM LEADING TO A LARGE PASSAGE TO THE EAST.  SMALL\nPASSAGES GO WEST AND UP.  THE REMNANTS OF RECENT DIGGING ARE EVIDENT.\nA SIGN IN MIDAIR HERE SAYS \"CAVE UNDER CONSTRUCTION BEYOND THIS POINT.\nPROCEED AT OWN RISK.  [WITT CONSTRUCTION COMPANY]\"\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> e\nYOU ARE AT WITT'S END.  PASSAGES LEAD OFF IN *ALL* DIRECTIONS.\n<BLANKLINE>\n>>> w\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND FOUND YOUR WAY\nBLOCKED BY A RECENT CAVE-IN.  YOU ARE NOW BACK IN THE MAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> s\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> se\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE AT WITT'S END.  PASSAGES LEAD OFF IN *ALL* DIRECTIONS.\n<BLANKLINE>\n>>> nw\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> d\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> s\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE AT WITT'S END.  PASSAGES LEAD OFF IN *ALL* DIRECTIONS.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> se\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> nw\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> d\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE AT WITT'S END.  PASSAGES LEAD OFF IN *ALL* DIRECTIONS.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> s\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> se\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\nDO YOU NEED HELP GETTING OUT OF HERE?\n<BLANKLINE>\n>>> yes\nDON'T GO WEST.\n<BLANKLINE>\n>>> nw\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE AT WITT'S END.  PASSAGES LEAD OFF IN *ALL* DIRECTIONS.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> d\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\n>>> s\nYOU'RE IN ANTEROOM.\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> w\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> w\nYOU ARE IN A ROOM WHOSE WALLS RESEMBLE SWISS CHEESE.  OBVIOUS PASSAGES\nGO WEST, EAST, NE, AND NW.  PART OF THE ROOM IS OCCUPIED BY A LARGE\nBEDROCK BLOCK.\n<BLANKLINE>\n>>> w\nYOU ARE AT THE EAST END OF THE TWOPIT ROOM.  THE FLOOR HERE IS\nLITTERED WITH THIN ROCK SLABS, WHICH MAKE IT EASY TO DESCEND THE PITS.\nTHERE IS A PATH HERE BYPASSING THE PITS TO CONNECT PASSAGES FROM EAST\nAND WEST.  THERE ARE HOLES ALL OVER, BUT THE ONLY BIG ONE IS ON THE\nWALL DIRECTLY OVER THE WEST PIT WHERE YOU CAN'T GET TO IT.\n<BLANKLINE>\n>>> d\nYOU ARE AT THE BOTTOM OF THE EASTERN PIT IN THE TWOPIT ROOM.  THERE IS\nA SMALL POOL OF OIL IN ONE CORNER OF THE PIT.\n<BLANKLINE>\n>>> u\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\n>>> w\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU ARE AT THE WEST END OF THE TWOPIT ROOM.  THERE IS A LARGE HOLE IN\nTHE WALL ABOVE THE PIT AT THIS END OF THE ROOM.\n<BLANKLINE>\n>>> throw(axe)\nYOU KILLED A LITTLE DWARF.\n<BLANKLINE>\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> down\nYOU ARE AT THE BOTTOM OF THE WESTERN PIT IN THE TWOPIT ROOM.  THERE IS\nA LARGE HOLE IN THE WALL ABOUT 25 FEET ABOVE YOU.\n<BLANKLINE>\nTHERE IS A TINY LITTLE PLANT IN THE PIT, MURMURING \"WATER, WATER, ...\"\n<BLANKLINE>\n>>> u\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\n>>> w\nYOU ARE IN A LARGE LOW CIRCULAR CHAMBER WHOSE FLOOR IS AN IMMENSE SLAB\nFALLEN FROM THE CEILING (SLAB ROOM).  EAST AND WEST THERE ONCE WERE\nLARGE PASSAGES, BUT THEY ARE NOW FILLED WITH BOULDERS.  LOW SMALL\nPASSAGES GO NORTH AND SOUTH, AND THE SOUTH ONE QUICKLY BENDS WEST\nAROUND THE BOULDERS.\n<BLANKLINE>\n>>> n\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> n\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> n\nDEAD END CRAWL.\n<BLANKLINE>\n>>> s\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> sw\nYOU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF SIGHT IN BOTH\nDIRECTIONS.\n<BLANKLINE>\n>>> u\nYOU ARE ON ONE SIDE OF A LARGE, DEEP CHASM.  A HEAVY WHITE MIST RISING\nUP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE.  A SW PATH LEADS AWAY\nFROM THE CHASM INTO A WINDING CORRIDOR.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> sw\nYOU'RE IN SLOPING CORRIDOR.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> se\nTHIS IS THE ORIENTAL ROOM.  ANCIENT ORIENTAL CAVE DRAWINGS COVER THE\nWALLS.  A GENTLY SLOPING PASSAGE LEADS UPWARD TO THE NORTH, ANOTHER\nPASSAGE LEADS SE, AND A HANDS AND KNEES CRAWL LEADS WEST.\n<BLANKLINE>\nTHERE IS A DELICATE, PRECIOUS, MING VASE HERE!\n<BLANKLINE>\n>>> get(vase)\nOK\n<BLANKLINE>\n>>> n\nYOU ARE FOLLOWING A WIDE PATH AROUND THE OUTER EDGE OF A LARGE CAVERN.\nFAR BELOW, THROUGH A HEAVY WHITE MIST, STRANGE SPLASHING NOISES CAN BE\nHEARD.  THE MIST RISES UP THROUGH A FISSURE IN THE CEILING.  THE PATH\nEXITS TO THE SOUTH AND WEST.\n<BLANKLINE>\n>>> w\nYOU ARE IN AN ALCOVE.  A SMALL NW PATH SEEMS TO WIDEN AFTER A SHORT\nDISTANCE.  AN EXTREMELY TIGHT TUNNEL LEADS EAST.  IT LOOKS LIKE A VERY\nTIGHT SQUEEZE.  AN EERIE LIGHT CAN BE SEEN AT THE OTHER END.\n<BLANKLINE>\n>>> e\nSOMETHING YOU'RE CARRYING WON'T FIT THROUGH THE TUNNEL WITH YOU.\nYOU'D BEST TAKE INVENTORY AND DROP SOMETHING.\n<BLANKLINE>\nOUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE!  \"HAR, HAR,\"\nHE CHORTLES, \"I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME\nCHEST DEEP IN THE MAZE!\"  HE SNATCHES YOUR TREASURE AND VANISHES INTO\nTHE GLOOM.\n<BLANKLINE>\nYOU'RE IN ALCOVE.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nWICKER CAGE\nDWARF'S AXE\n<BLANKLINE>\n>>> drop(keys)\nOK\n<BLANKLINE>\n>>> drop(lantern)\nOK\n<BLANKLINE>\n>>> drop(cage)\nOK\n<BLANKLINE>\n>>> drop(axe)\nOK\n<BLANKLINE>\n>>> e\nYOU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT.  AN EXTREMELY\nNARROW TUNNEL EXITS TO THE WEST.  A DARK CORRIDOR LEADS NE.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\n>>> get(emerald)\nOK\n<BLANKLINE>\n>>> ne\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> s\nYOU'RE IN PLOVER ROOM.\n<BLANKLINE>\n>>> plover\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> drop(emerald)\nI SEE NO EMERALD HERE.\n<BLANKLINE>\n>>> plover\nYOU'RE IN PLOVER ROOM.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\n>>> get(emerald)\nOK\n<BLANKLINE>\n>>> w\nYOU'RE IN ALCOVE.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A LAMP SHINING NEARBY.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(keys)\nOK\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> nw\nYOU'RE IN MISTY CAVERN.\n<BLANKLINE>\n>>> s\nYOU'RE IN ORIENTAL ROOM.\n<BLANKLINE>\n>>> se\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> e\nYOU ARE IN THE SOFT ROOM.  THE WALLS ARE COVERED WITH HEAVY CURTAINS,\nTHE FLOOR WITH A THICK PILE CARPET.  MOSS COVERS THE CEILING.\n<BLANKLINE>\nA SMALL VELVET PILLOW LIES ON THE FLOOR.\n<BLANKLINE>\n>>> get(pillow)\nOK\n<BLANKLINE>\n>>> w\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> ne\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> u\nYOU ARE IN A SECRET N/S CANYON ABOVE A SIZABLE PASSAGE.\n<BLANKLINE>\n>>> n\nYOU ARE IN A SECRET CANYON AT A JUNCTION OF THREE CANYONS, BEARING\nNORTH, SOUTH, AND SE.  THE NORTH ONE IS AS TALL AS THE OTHER TWO\nCOMBINED.\n<BLANKLINE>\n>>> n\nYOU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF\nSIGHT.  A FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW.  TRACES OF\nWHITE MIST COVER THE FLOOR OF THE PIT, BECOMING THICKER TO THE LEFT.\nMARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT\nSOMEONE HAS BEEN HERE RECENTLY.  DIRECTLY ACROSS THE PIT FROM YOU AND\n25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM.  A\nSHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU.\n<BLANKLINE>\nTHE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT YOUR ATTENTION.\n<BLANKLINE>\n>>> w\nYOU'RE AT JUNCTION OF THREE SECRET CANYONS.\n<BLANKLINE>\n>>> s\nYOU ARE IN A SECRET N/S CANYON ABOVE A SIZABLE PASSAGE.\n<BLANKLINE>\n>>> s\nA LARGE STALACTITE EXTENDS FROM THE ROOF AND ALMOST REACHES THE FLOOR\nBELOW.  YOU COULD CLIMB DOWN IT, AND JUMP FROM IT TO THE FLOOR, BUT\nHAVING DONE SO YOU WOULD BE UNABLE TO REACH IT TO CLIMB BACK UP.\n<BLANKLINE>\n>>> d\nOUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE!  \"HAR, HAR,\"\nHE CHORTLES, \"I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME\nCHEST DEEP IN THE MAZE!\"  HE SNATCHES YOUR TREASURE AND VANISHES INTO\nTHE GLOOM.\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> w\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> e\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> n\nTHERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU.\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> e\nYOU ARE ON THE BRINK OF A THIRTY FOOT PIT WITH A MASSIVE ORANGE COLUMN\nDOWN ONE WALL.  YOU COULD CLIMB DOWN HERE BUT YOU COULD NOT GET BACK\nUP.  THE MAZE CONTINUES AT THIS LEVEL.\n<BLANKLINE>\n>>> e\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> nw\nDEAD END\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\nTHERE IS A DELICATE, PRECIOUS, MING VASE HERE!\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\n>>> drop(axe)\nOK\n<BLANKLINE>\n>>> drop(keys)\nOK\n<BLANKLINE>\n>>> get(chest)\nOK\n<BLANKLINE>\n>>> get(gold)\nOK\n<BLANKLINE>\n>>> get(silver)\nOK\n<BLANKLINE>\n>>> get(vase)\nOK\n<BLANKLINE>\n>>> get(emerald)\nOK\n<BLANKLINE>\n>>> look\nDEAD END\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> se\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> n\nYOU'RE AT BRINK OF PIT.\n<BLANKLINE>\n>>> d\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\n>>> e\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> e\nYOU'RE IN DEBRIS ROOM.\n<BLANKLINE>\n>>> xyzzy\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\n>>> drop(chest)\nOK\n<BLANKLINE>\n>>> drop(gold)\nOK\n<BLANKLINE>\n>>> drop(silver)\nOK\n<BLANKLINE>\n>>> drop(vase)\nTHE MING VASE DROPS WITH A DELICATE CRASH.\n<BLANKLINE>\n>>> drop(emerald)\nOK\n<BLANKLINE>\n>>> drop(pillow)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n<BLANKLINE>\nA SMALL VELVET PILLOW LIES ON THE FLOOR.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\nTHE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 137 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> d\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> w\nYOU'RE IN DUSTY ROCK ROOM.\n<BLANKLINE>\n>>> d\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> w\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> w\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> w\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\n>>> w\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A TINY LITTLE PLANT IN THE PIT, MURMURING \"WATER, WATER, ...\"\n<BLANKLINE>\n>>> say(water)\nOKAY, \"WATER\".\n<BLANKLINE>\n>>> pour(water)\nTHE PLANT SPURTS INTO FURIOUS GROWTH FOR A FEW SECONDS.\n<BLANKLINE>\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A 12-FOOT-TALL BEANSTALK STRETCHING UP OUT OF THE PIT,\nBELLOWING \"WATER!! WATER!!\"\n<BLANKLINE>\n>>> climb\nYOU HAVE CLIMBED UP THE PLANT AND OUT OF THE PIT.\n<BLANKLINE>\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHE TOP OF A 12-FOOT-TALL BEANSTALK IS POKING OUT OF THE WEST PIT.\n<BLANKLINE>\n>>> w\nYOU'RE IN SLAB ROOM.\n<BLANKLINE>\n>>> u\nYOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM.\n<BLANKLINE>\n>>> n\nYOU'RE IN MIRROR CANYON.\n<BLANKLINE>\n>>> n\nYOU'RE AT RESERVOIR.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\nSMALL BOTTLE\n<BLANKLINE>\n>>> get(water)\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\nSMALL BOTTLE\nWATER IN THE BOTTLE\n<BLANKLINE>\n>>> s\nYOU'RE IN MIRROR CANYON.\n<BLANKLINE>\n>>> s\nYOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM.\n<BLANKLINE>\n>>> d\nYOU'RE IN SLAB ROOM.\n<BLANKLINE>\n>>> s\nYOU ARE AT THE WEST END OF THE TWOPIT ROOM.  THERE IS A LARGE HOLE IN\nTHE WALL ABOVE THE PIT AT THIS END OF THE ROOM.\n<BLANKLINE>\nTHE TOP OF A 12-FOOT-TALL BEANSTALK IS POKING OUT OF THE WEST PIT.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A 12-FOOT-TALL BEANSTALK STRETCHING UP OUT OF THE PIT,\nBELLOWING \"WATER!! WATER!!\"\n<BLANKLINE>\n>>> pour(water)\nTHE PLANT GROWS EXPLOSIVELY, ALMOST FILLING THE BOTTOM OF THE PIT.\n<BLANKLINE>\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> climb\nYOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP.\n<BLANKLINE>\nYOU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT OF SIGHT TO THE\nWEST.  AT THE EASTERN END IS A HOLE THROUGH WHICH YOU CAN SEE A\nPROFUSION OF LEAVES.\n<BLANKLINE>\n>>> w\nYOU ARE IN THE GIANT ROOM.  THE CEILING HERE IS TOO HIGH UP FOR YOUR\nLAMP TO SHOW IT.  CAVERNOUS PASSAGES LEAD EAST, NORTH, AND SOUTH.  ON\nTHE WEST WALL IS SCRAWLED THE INSCRIPTION, \"FEE FIE FOE FOO\" [SIC].\n<BLANKLINE>\nTHERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS!\n<BLANKLINE>\n>>> get(nest)\nOK\n<BLANKLINE>\n>>> e\nTHE PASSAGE HERE IS BLOCKED BY A RECENT CAVE-IN.\n<BLANKLINE>\n>>> w\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nTHE PASSAGE HERE IS BLOCKED BY A RECENT CAVE-IN.\n<BLANKLINE>\n>>> n\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nTHE PASSAGE HERE IS BLOCKED BY A RECENT CAVE-IN.\n<BLANKLINE>\n>>> s\nYOU'RE IN GIANT ROOM.\n<BLANKLINE>\n>>> n\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> n\nTHE DOOR IS EXTREMELY RUSTY AND REFUSES TO OPEN.\n<BLANKLINE>\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> s\nYOU'RE IN GIANT ROOM.\n<BLANKLINE>\n>>> s\nYOU'RE IN NARROW CORRIDOR.\n<BLANKLINE>\n>>> d\nYOU ARE AT THE BOTTOM OF THE WESTERN PIT IN THE TWOPIT ROOM.  THERE IS\nA LARGE HOLE IN THE WALL ABOUT 25 FEET ABOVE YOU.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> u\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> e\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> d\nYOU'RE IN EAST PIT.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\nSMALL BOTTLE\nGOLDEN EGGS\n<BLANKLINE>\n>>> get(oil)\nYOUR BOTTLE IS NOW FULL OF OIL.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\nSMALL BOTTLE\nOIL IN THE BOTTLE\nGOLDEN EGGS\n<BLANKLINE>\n>>> climb\nI DON'T KNOW HOW TO APPLY THAT WORD HERE.\n<BLANKLINE>\nYOU'RE IN EAST PIT.\n<BLANKLINE>\n>>> u\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> w\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> climb\nI DON'T KNOW HOW TO APPLY THAT WORD HERE.\n<BLANKLINE>\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> climb\nYOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP.\n<BLANKLINE>\nYOU'RE IN NARROW CORRIDOR.\n<BLANKLINE>\n>>> fee\nOK\n<BLANKLINE>\n>>> fie\nOK\n<BLANKLINE>\n>>> foe\nOK\n<BLANKLINE>\n>>> fum\nWHAT'S THE MATTER, CAN'T YOU READ?  NOW YOU'D BEST START OVER.\n<BLANKLINE>\n>>> foo\nWHAT'S THE MATTER, CAN'T YOU READ?  NOW YOU'D BEST START OVER.\n<BLANKLINE>\n>>> fee\nOK\n<BLANKLINE>\n>>> fie\nOK\n<BLANKLINE>\n>>> foe\nOK\n<BLANKLINE>\n>>> foo\nTHE NEST OF GOLDEN EGGS HAS VANISHED!\n<BLANKLINE>\n>>> w\nYOU'RE IN GIANT ROOM.\n<BLANKLINE>\nTHERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS!\n<BLANKLINE>\n>>> get\nOK\n<BLANKLINE>\n>>> n\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> pour\nTHE OIL HAS FREED UP THE HINGES SO THAT THE DOOR WILL NOW MOVE,\nALTHOUGH IT REQUIRES SOME EFFORT.\n<BLANKLINE>\n>>> look\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> unlock\nOK\n<BLANKLINE>\n>>> look\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> n\nYOU ARE IN A MAGNIFICENT CAVERN WITH A RUSHING STREAM, WHICH CASCADES\nOVER A SPARKLING WATERFALL INTO A ROARING WHIRLPOOL WHICH DISAPPEARS\nTHROUGH A HOLE IN THE FLOOR.  PASSAGES EXIT TO THE SOUTH AND WEST.\n<BLANKLINE>\nTHERE IS A JEWEL-ENCRUSTED TRIDENT HERE!\n<BLANKLINE>\n>>> drink\nYOU HAVE TAKEN A DRINK FROM THE STREAM.  THE WATER TASTES STRONGLY OF\nMINERALS, BUT IS NOT UNPLEASANT.  IT IS EXTREMELY COLD.\n<BLANKLINE>\n>>> get(trident)\nOK\n<BLANKLINE>\n>>> w\nYOU ARE AT THE TOP OF A STEEP INCLINE ABOVE A LARGE ROOM.  YOU COULD\nCLIMB DOWN HERE, BUT YOU WOULD NOT BE ABLE TO CLIMB UP.  THERE IS A\nPASSAGE LEADING BACK TO THE NORTH.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> sw\nYOU'RE IN SLOPING CORRIDOR.\n<BLANKLINE>\n>>> u\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> cross\nTHE TROLL REFUSES TO LET YOU CROSS.\n<BLANKLINE>\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> hit(troll)\nTROLLS ARE CLOSE RELATIVES WITH THE ROCKS AND HAVE SKIN AS TOUGH AS\nTHAT OF A RHINOCEROS.  THE TROLL FENDS OFF YOUR BLOWS EFFORTLESSLY.\n<BLANKLINE>\n>>> throw(eggs)\nTHE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGHT.\n<BLANKLINE>\n>>> look\nYOU ARE ON ONE SIDE OF A LARGE, DEEP CHASM.  A HEAVY WHITE MIST RISING\nUP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE.  A SW PATH LEADS AWAY\nFROM THE CHASM INTO A WINDING CORRIDOR.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> cross\nYOU ARE ON THE FAR SIDE OF THE CHASM.  A NE PATH LEADS AWAY FROM THE\nCHASM ON THIS SIDE.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> cross\nTHE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR WAY.\n<BLANKLINE>\nYOU'RE ON NE SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> ne\nYOU'RE IN A LONG EAST/WEST CORRIDOR.  A FAINT RUMBLING NOISE CAN BE\nHEARD IN THE DISTANCE.\n<BLANKLINE>\n>>> e\nTHE PATH FORKS HERE.  THE LEFT FORK LEADS NORTHEAST.  A DULL RUMBLING\nSEEMS TO GET LOUDER IN THAT DIRECTION.  THE RIGHT FORK LEADS SOUTHEAST\nDOWN A GENTLE SLOPE.  THE MAIN CORRIDOR ENTERS FROM THE WEST.\n<BLANKLINE>\n>>> se\nYOU ARE WALKING ALONG A GENTLY SLOPING NORTH/SOUTH PASSAGE LINED WITH\nODDLY SHAPED LIMESTONE FORMATIONS.\n<BLANKLINE>\n>>> s\nYOU ARE STANDING AT THE ENTRANCE TO A LARGE, BARREN ROOM.  A SIGN\nPOSTED ABOVE THE ENTRANCE READS:  \"CAUTION!  BEAR IN ROOM!\"\n<BLANKLINE>\n>>> enter\nYOU ARE INSIDE A BARREN ROOM.  THE CENTER OF THE ROOM IS COMPLETELY\nEMPTY EXCEPT FOR SOME DUST.  MARKS IN THE DUST LEAD AWAY TOWARD THE\nFAR END OF THE ROOM.  THE ONLY EXIT IS THE WAY YOU CAME IN.\n<BLANKLINE>\nTHERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE FAR END OF THE ROOM!\n<BLANKLINE>\nTHE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAIN!\n<BLANKLINE>\n>>> get(chain)\nTHE CHAIN IS STILL LOCKED.\n<BLANKLINE>\n>>> unlock\nYOU HAVE NO KEYS!\n<BLANKLINE>\n>>> kill(bear)\nWITH WHAT?  YOUR BARE HANDS?  AGAINST *HIS* BEAR HANDS??\n<BLANKLINE>\n>>> yes\nI DON'T KNOW THAT WORD.\n<BLANKLINE>\n>>> get(bear)\nYOU CAN'T BE SERIOUS!\n<BLANKLINE>\n>>> leave\nYOU'RE IN FRONT OF BARREN ROOM.\n<BLANKLINE>\n>>> w\nYOU'RE IN LIMESTONE PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT FORK IN PATH.\n<BLANKLINE>\n>>> ne\nTHE WALLS ARE QUITE WARM HERE.  FROM THE NORTH CAN BE HEARD A STEADY\nROAR, SO LOUD THAT THE ENTIRE CAVE SEEMS TO BE TREMBLING.  ANOTHER\nPASSAGE LEADS SOUTH, AND A LOW CRAWL GOES EAST.\n<BLANKLINE>\n>>> e\nYOU ARE IN A SMALL CHAMBER FILLED WITH LARGE BOULDERS.  THE WALLS ARE\nVERY WARM, CAUSING THE AIR IN THE ROOM TO BE ALMOST STIFLING FROM THE\nHEAT.  THE ONLY EXIT IS A CRAWL HEADING WEST, THROUGH WHICH IS COMING\nA LOW RUMBLING.\n<BLANKLINE>\nTHERE ARE RARE SPICES HERE!\n<BLANKLINE>\n>>> get(spices)\nOK\n<BLANKLINE>\n>>> w\nYOU'RE AT JUNCTION WITH WARM WALLS.\n<BLANKLINE>\n>>> n\nYOU ARE ON THE EDGE OF A BREATH-TAKING VIEW.  FAR BELOW YOU IS AN\nACTIVE VOLCANO, FROM WHICH GREAT GOUTS OF MOLTEN LAVA COME SURGING\nOUT, CASCADING BACK DOWN INTO THE DEPTHS.  THE GLOWING ROCK FILLS THE\nFARTHEST REACHES OF THE CAVERN WITH A BLOOD-RED GLARE, GIVING EVERY-\nTHING AN EERIE, MACABRE APPEARANCE.  THE AIR IS FILLED WITH FLICKERING\nSPARKS OF ASH AND A HEAVY SMELL OF BRIMSTONE.  THE WALLS ARE HOT TO\nTHE TOUCH, AND THE THUNDERING OF THE VOLCANO DROWNS OUT ALL OTHER\nSOUNDS.  EMBEDDED IN THE JAGGED ROOF FAR OVERHEAD ARE MYRIAD TWISTED\nFORMATIONS COMPOSED OF PURE WHITE ALABASTER, WHICH SCATTER THE MURKY\nLIGHT INTO SINISTER APPARITIONS UPON THE WALLS.  TO ONE SIDE IS A DEEP\nGORGE, FILLED WITH A BIZARRE CHAOS OF TORTURED ROCK WHICH SEEMS TO\nHAVE BEEN CRAFTED BY THE DEVIL HIMSELF.  AN IMMENSE RIVER OF FIRE\nCRASHES OUT FROM THE DEPTHS OF THE VOLCANO, BURNS ITS WAY THROUGH THE\nGORGE, AND PLUMMETS INTO A BOTTOMLESS PIT FAR OFF TO YOUR LEFT.  TO\nTHE RIGHT, AN IMMENSE GEYSER OF BLISTERING STEAM ERUPTS CONTINUOUSLY\nFROM A BARREN ISLAND IN THE CENTER OF A SULFUROUS LAKE, WHICH BUBBLES\nOMINOUSLY.  THE FAR RIGHT WALL IS AFLAME WITH AN INCANDESCENCE OF ITS\nOWN, WHICH LENDS AN ADDITIONAL INFERNAL SPLENDOR TO THE ALREADY\nHELLISH SCENE.  A DARK, FOREBODING PASSAGE EXITS TO THE SOUTH.\n<BLANKLINE>\n>>> s\nYOU'RE AT JUNCTION WITH WARM WALLS.\n<BLANKLINE>\n>>> s\nYOU'RE AT FORK IN PATH.\n<BLANKLINE>\n>>> w\nYOU'RE IN CORRIDOR.\n<BLANKLINE>\n>>> w\nYOU'RE ON NE SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> throw(spices)\nTHE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGHT.\n<BLANKLINE>\n>>> cross\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> sw\nYOU'RE IN SLOPING CORRIDOR.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> se\nYOU'RE IN ORIENTAL ROOM.\n<BLANKLINE>\n>>> se\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> ne\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> e\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> n\nYOU'RE IN SHELL ROOM.\n<BLANKLINE>\nTHERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED.\n<BLANKLINE>\n>>> unlock(clam)\nA GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS AWAY.  GOODNESS,\nTHIS MUST REALLY BE AN OYSTER.  (I NEVER WAS VERY GOOD AT IDENTIFYING\nBIVALVES.)  WHATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAIN.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS.\n<BLANKLINE>\n>>> d\nYOU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET ACROSS.\n<BLANKLINE>\nOFF TO ONE SIDE LIES A GLISTENING PEARL!\n<BLANKLINE>\n>>> get(pearl)\nOK\n<BLANKLINE>\n>>> u\nYOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS.\n<BLANKLINE>\n>>> u\nYOU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY ROCK.  THE FLOOR AND\nWALLS ARE LITTERED WITH BITS OF SHELLS IMBEDDED IN THE STONE.  A\nSHALLOW PASSAGE PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEADS\nUP.  A LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SOUTH.\n<BLANKLINE>\nTHERE IS AN ENORMOUS OYSTER HERE WITH ITS SHELL TIGHTLY CLOSED.\n<BLANKLINE>\n>>> s\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> u\nYOU'RE IN DUSTY ROCK ROOM.\n<BLANKLINE>\n>>> e\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\nA HOLLOW VOICE SAYS \"PLUGH\".\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nA SMALL VELVET PILLOW LIES ON THE FLOOR.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\nTHE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\n>>> drop(trident)\nOK\n<BLANKLINE>\n>>> drop(pearl)\nOK\n<BLANKLINE>\n>>> get(food)\nOK\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 175 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> xyzzy\nYOU ARE IN A DEBRIS ROOM FILLED WITH STUFF WASHED IN FROM THE SURFACE.\nA LOW WIDE PASSAGE WITH COBBLES BECOMES PLUGGED WITH MUD AND DEBRIS\nHERE, BUT AN AWKWARD CANYON LEADS UPWARD AND WEST.  A NOTE ON THE WALL\nSAYS \"MAGIC WORD XYZZY\".\n<BLANKLINE>\n>>> w\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> w\nYOU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH.  THE WALLS ARE FROZEN\nRIVERS OF ORANGE STONE.  AN AWKWARD CANYON AND A GOOD PASSAGE EXIT\nFROM EAST AND WEST SIDES OF THE CHAMBER.\n<BLANKLINE>\n>>> w\nYOU'RE AT TOP OF SMALL PIT.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> d\nYOU ARE AT ONE END OF A VAST HALL STRETCHING FORWARD OUT OF SIGHT TO\nTHE WEST.  THERE ARE OPENINGS TO EITHER SIDE.  NEARBY, A WIDE STONE\nSTAIRCASE LEADS DOWNWARD.  THE HALL IS FILLED WITH WISPS OF WHITE MIST\nSWAYING TO AND FRO ALMOST AS IF ALIVE.  A COLD WIND BLOWS UP THE\nSTAIRCASE.  THERE IS A PASSAGE AT THE TOP OF A DOME BEHIND YOU.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> w\nYOU ARE ON THE EAST BANK OF A FISSURE SLICING CLEAR ACROSS THE HALL.\nTHE MIST IS QUITE THICK HERE, AND THE FISSURE IS TOO WIDE TO JUMP.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> w\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> w\nYOU'RE AT WEST END OF HALL OF MISTS.\n<BLANKLINE>\n>>> s\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> e\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> n\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> e\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU'RE AT BRINK OF PIT.\n<BLANKLINE>\n>>> n\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> e\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> nw\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(keys)\nOK\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(axe)\nYOU KILLED A LITTLE DWARF.\n<BLANKLINE>\nDEAD END\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> se\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> w\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nYOU'RE AT BRINK OF PIT.\n<BLANKLINE>\n>>> d\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\n>>> w\nAT YOUR FEET IS A SMALL PIT BREATHING TRACES OF WHITE MIST.  AN EAST\nPASSAGE ENDS HERE EXCEPT FOR A SMALL CRACK LEADING ON.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> d\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> d\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> n\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> d\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> w\nYOU'RE IN DUSTY ROCK ROOM.\n<BLANKLINE>\n>>> d\nYOU ARE AT A COMPLEX JUNCTION.  A LOW HANDS AND KNEES PASSAGE FROM THE\nNORTH JOINS A HIGHER CRAWL FROM THE EAST TO MAKE A WALKING PASSAGE\nGOING WEST.  THERE IS ALSO A LARGE ROOM ABOVE.  THE AIR IS DAMP HERE.\n<BLANKLINE>\n>>> w\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> w\nYOU ARE IN A ROOM WHOSE WALLS RESEMBLE SWISS CHEESE.  OBVIOUS PASSAGES\nGO WEST, EAST, NE, AND NW.  PART OF THE ROOM IS OCCUPIED BY A LARGE\nBEDROCK BLOCK.\n<BLANKLINE>\n>>> w\nYOU ARE AT THE EAST END OF THE TWOPIT ROOM.  THE FLOOR HERE IS\nLITTERED WITH THIN ROCK SLABS, WHICH MAKE IT EASY TO DESCEND THE PITS.\nTHERE IS A PATH HERE BYPASSING THE PITS TO CONNECT PASSAGES FROM EAST\nAND WEST.  THERE ARE HOLES ALL OVER, BUT THE ONLY BIG ONE IS ON THE\nWALL DIRECTLY OVER THE WEST PIT WHERE YOU CAN'T GET TO IT.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> w\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> climb\nYOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP.\n<BLANKLINE>\nYOU'RE IN NARROW CORRIDOR.\n<BLANKLINE>\n>>> w\nYOU'RE IN GIANT ROOM.\n<BLANKLINE>\n>>> fee\nOK\n<BLANKLINE>\n>>> fie\nOK\n<BLANKLINE>\n>>> foe\nOK\n<BLANKLINE>\n>>> foo\nTHERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS!\n<BLANKLINE>\n>>> get(eggs)\nOK\n<BLANKLINE>\n>>> n\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> n\nYOU'RE IN CAVERN WITH WATERFALL.\n<BLANKLINE>\n>>> w\nYOU'RE AT STEEP INCLINE ABOVE LARGE ROOM.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> sw\nYOU'RE IN SLOPING CORRIDOR.\n<BLANKLINE>\n>>> u\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> cross\nTHE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR WAY.\n<BLANKLINE>\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> throw(axe)\nTHE TROLL DEFTLY CATCHES THE AXE, EXAMINES IT CAREFULLY, AND TOSSES IT\nBACK, DECLARING, \"GOOD WORKMANSHIP, BUT IT'S NOT VALUABLE ENOUGH.\"\n<BLANKLINE>\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> throw(eggs)\nTHE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGHT.\n<BLANKLINE>\n>>> cross\nYOU'RE ON NE SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> ne\nYOU'RE IN CORRIDOR.\n<BLANKLINE>\n>>> e\nYOU'RE AT FORK IN PATH.\n<BLANKLINE>\n>>> se\nYOU'RE IN LIMESTONE PASSAGE.\n<BLANKLINE>\n>>> s\nYOU'RE IN FRONT OF BARREN ROOM.\n<BLANKLINE>\n>>> enter\nYOU'RE IN BARREN ROOM.\n<BLANKLINE>\nTHERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE FAR END OF THE ROOM!\n<BLANKLINE>\nTHE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAIN!\n<BLANKLINE>\n>>> throw(food)\nTHE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH HE SEEMS TO CALM\nDOWN CONSIDERABLY AND EVEN BECOMES RATHER FRIENDLY.\n<BLANKLINE>\n>>> get(bear)\nTHE BEAR IS STILL CHAINED TO THE WALL.\n<BLANKLINE>\n>>> get(chain)\nTHE CHAIN IS STILL LOCKED.\n<BLANKLINE>\n>>> unlock(chain)\nTHE CHAIN IS NOW UNLOCKED.\n<BLANKLINE>\n>>> get(chain)\nOK\n<BLANKLINE>\n>>> get(bear)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU ARE INSIDE A BARREN ROOM.  THE CENTER OF THE ROOM IS COMPLETELY\nEMPTY EXCEPT FOR SOME DUST.  MARKS IN THE DUST LEAD AWAY TOWARD THE\nFAR END OF THE ROOM.  THE ONLY EXIT IS THE WAY YOU CAME IN.\n<BLANKLINE>\n>>> leave\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE IN FRONT OF BARREN ROOM.\n<BLANKLINE>\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE IN LIMESTONE PASSAGE.\n<BLANKLINE>\n>>> n\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE AT FORK IN PATH.\n<BLANKLINE>\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE IN CORRIDOR.\n<BLANKLINE>\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE ON NE SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> cross\nTHE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR WAY.\n<BLANKLINE>\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU ARE ON THE FAR SIDE OF THE CHASM.  A NE PATH LEADS AWAY FROM THE\nCHASM ON THIS SIDE.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> drop(bear)\nTHE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A STARTLED SHRIEK AND\nSCURRIES AWAY.  THE BEAR SOON GIVES UP THE PURSUIT AND WANDERS BACK.\n<BLANKLINE>\n>>> cross\nYOU ARE ON ONE SIDE OF A LARGE, DEEP CHASM.  A HEAVY WHITE MIST RISING\nUP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE.  A SW PATH LEADS AWAY\nFROM THE CHASM INTO A WINDING CORRIDOR.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> sw\nYOU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF SIGHT IN BOTH\nDIRECTIONS.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> se\nYOU'RE IN ORIENTAL ROOM.\n<BLANKLINE>\n>>> se\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> w\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> w\nYOU ARE AT THE WEST END OF THE TWOPIT ROOM.  THERE IS A LARGE HOLE IN\nTHE WALL ABOVE THE PIT AT THIS END OF THE ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> climb\nYOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP.\n<BLANKLINE>\nYOU'RE IN NARROW CORRIDOR.\n<BLANKLINE>\n>>> w\nYOU ARE IN THE GIANT ROOM.  THE CEILING HERE IS TOO HIGH UP FOR YOUR\nLAMP TO SHOW IT.  CAVERNOUS PASSAGES LEAD EAST, NORTH, AND SOUTH.  ON\nTHE WEST WALL IS SCRAWLED THE INSCRIPTION, \"FEE FIE FOE FOO\" [SIC].\n<BLANKLINE>\n>>> fee\nOK\n<BLANKLINE>\n>>> fie\nOK\n<BLANKLINE>\n>>> foe\nOK\n<BLANKLINE>\n>>> foo\nTHERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS!\n<BLANKLINE>\n>>> get(eggs)\nOK\n<BLANKLINE>\n>>> s\nYOU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT OF SIGHT TO THE\nWEST.  AT THE EASTERN END IS A HOLE THROUGH WHICH YOU CAN SEE A\nPROFUSION OF LEAVES.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> u\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> w\nYOU'RE IN SLAB ROOM.\n<BLANKLINE>\n>>> u\nYOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM.\n<BLANKLINE>\n>>> s\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nTHE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SIDE.\n<BLANKLINE>\n>>> e\nYOU'RE IN SECRET E/W CANYON ABOVE TIGHT CANYON.\n<BLANKLINE>\n>>> e\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> n\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\nA HOLLOW VOICE SAYS \"PLUGH\".\n<BLANKLINE>\n>>> say(plugh)\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nA SMALL VELVET PILLOW LIES ON THE FLOOR.\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\nTHERE IS A JEWEL-ENCRUSTED TRIDENT HERE!\n<BLANKLINE>\nTHE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\nOFF TO ONE SIDE LIES A GLISTENING PEARL!\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nSET OF KEYS\nBRASS LANTERN\nSMALL BOTTLE\nDWARF'S AXE\nGOLDEN EGGS\nGOLDEN CHAIN\n<BLANKLINE>\n>>> drop(eggs)\nOK\n<BLANKLINE>\n>>> drop(chain)\nOK\n<BLANKLINE>\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plover\nYOU'RE IN PLOVER ROOM.\n<BLANKLINE>\n>>> ne\nYOU'RE IN THE DARK-ROOM.  A CORRIDOR LEADING SOUTH IS THE ONLY EXIT.\n<BLANKLINE>\nA MASSIVE STONE TABLET IMBEDDED IN THE WALL READS:\n\"CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-ROOM!\"\n<BLANKLINE>\nTHERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SIDE!\n<BLANKLINE>\n>>> get(pyramid)\nOK\n<BLANKLINE>\n>>> s\nYOU'RE IN PLOVER ROOM.\n<BLANKLINE>\n>>> plover\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nA SMALL VELVET PILLOW LIES ON THE FLOOR.\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\nTHERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS!\n<BLANKLINE>\nTHERE IS A JEWEL-ENCRUSTED TRIDENT HERE!\n<BLANKLINE>\nTHE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\nOFF TO ONE SIDE LIES A GLISTENING PEARL!\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\nTHERE IS A GOLDEN CHAIN LYING IN A HEAP ON THE FLOOR!\n<BLANKLINE>\n>>> drop(pyramid)\nOK\n<BLANKLINE>\n>>> score\nIF YOU WERE TO QUIT NOW, YOU WOULD SCORE 219 OUT OF A POSSIBLE 350.\n<BLANKLINE>\nDO YOU INDEED WISH TO QUIT NOW?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> e\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> u\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> w\nYOU'RE ON EAST BANK OF FISSURE.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> w\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH\nOF THE HALL OF MISTS.\n<BLANKLINE>\nYOU'RE AT WEST END OF HALL OF MISTS.\n<BLANKLINE>\n>>> w\nYOU'RE AT EAST END OF LONG HALL.\n<BLANKLINE>\n>>> w\nYOU'RE AT WEST END OF LONG HALL.\n<BLANKLINE>\n>>> n\nYOU ARE AT A CROSSOVER OF A HIGH N/S PASSAGE AND A LOW E/W ONE.\n<BLANKLINE>\n>>> e\nYOU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF THE MOUNTAIN KING.\nA PASSAGE CONTINUES WEST AND UP HERE.\n<BLANKLINE>\n>>> e\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\n>>> sw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\n>>> sw\nYOU ARE IN A SECRET CANYON WHICH HERE RUNS E/W.  IT CROSSES OVER A\nVERY TIGHT CANYON 15 FEET BELOW.  IF YOU GO DOWN YOU MAY NOT BE ABLE\nTO GET BACK UP.\n<BLANKLINE>\n>>> d\nYOU ARE AT A WIDE PLACE IN A VERY TIGHT N/S CANYON.\n<BLANKLINE>\n>>> u\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE AT A WIDE PLACE IN A VERY TIGHT N/S CANYON.\n<BLANKLINE>\n>>> s\nTHE CANYON HERE BECOMES TOO TIGHT TO GO FURTHER SOUTH.\n<BLANKLINE>\n>>> n\nYOU ARE AT A WIDE PLACE IN A VERY TIGHT N/S CANYON.\n<BLANKLINE>\n>>> n\nYOU ARE IN A TALL E/W CANYON.  A LOW TIGHT CRAWL GOES 3 FEET NORTH AND\nSEEMS TO OPEN UP.\n<BLANKLINE>\n>>> w\nTHE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD END.\n<BLANKLINE>\n>>> e\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nTHE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD END.\n<BLANKLINE>\n>>> n\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nTHE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD END.\n<BLANKLINE>\n>>> s\nYOU ARE IN A TALL E/W CANYON.  A LOW TIGHT CRAWL GOES 3 FEET NORTH AND\nSEEMS TO OPEN UP.\n<BLANKLINE>\n>>> n\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> ne\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> e\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> e\nYOU'RE IN ANTEROOM.\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> read(magazine)\nI'M AFRAID THE MAGAZINE IS WRITTEN IN DWARVISH.\n<BLANKLINE>\n>>> u\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> u\nA SEPULCHRAL VOICE REVERBERATING THROUGH THE CAVE, SAYS, \"CAVE CLOSING\nSOON.  ALL ADVENTURERS EXIT IMMEDIATELY THROUGH MAIN OFFICE.\"\n<BLANKLINE>\nYOU'RE IN DUSTY ROCK ROOM.\n<BLANKLINE>\n>>> e\nYOU ARE IN A DIRTY BROKEN PASSAGE.  TO THE EAST IS A CRAWL.  TO THE\nWEST IS A LARGE PASSAGE.  ABOVE YOU IS A HOLE TO ANOTHER PASSAGE.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plugh\nA MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES:\n   \"THIS EXIT IS CLOSED.  PLEASE LEAVE VIA MAIN OFFICE.\"\n<BLANKLINE>\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> e\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> u\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> u\nYOU'RE AT TOP OF SMALL PIT.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> e\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\n>>> e\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> e\nYOU'RE IN DEBRIS ROOM.\n<BLANKLINE>\n>>> xyzzy\nA MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES:\n   \"THIS EXIT IS CLOSED.  PLEASE LEAVE VIA MAIN OFFICE.\"\n<BLANKLINE>\nYOU'RE IN DEBRIS ROOM.\n<BLANKLINE>\n>>> e\nYOU'RE IN COBBLE CRAWL.\n<BLANKLINE>\n>>> e\nYOU'RE BELOW THE GRATE.\n<BLANKLINE>\nTHE GRATE IS LOCKED.\n<BLANKLINE>\n>>> unlock\nA MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES:\n   \"THIS EXIT IS CLOSED.  PLEASE LEAVE VIA MAIN OFFICE.\"\n<BLANKLINE>\n>>> w\nYOU'RE IN COBBLE CRAWL.\n<BLANKLINE>\n>>> w\nYOU'RE IN DEBRIS ROOM.\n<BLANKLINE>\n>>> w\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> w\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\n>>> w\nTHE SEPULCHRAL VOICE ENTONES, \"THE CAVE IS NOW CLOSED.\"  AS THE ECHOES\nFADE, THERE IS A BLINDING FLASH OF LIGHT (AND A SMALL PUFF OF ORANGE\nSMOKE). . . .    AS YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND...\n<BLANKLINE>\nYOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE\nGIANT ROOM.  IT APPEARS TO BE A REPOSITORY FOR THE \"ADVENTURE\"\nPROGRAM.  MASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY\nYELLOW LIGHT.  SCATTERED ABOUT YOU CAN BE SEEN A PILE OF BOTTLES (ALL\nOF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED\nOF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND\nA COLLECTION OF BRASS LANTERNS.  OFF TO ONE SIDE A GREAT MANY DWARVES\nARE SLEEPING ON THE FLOOR, SNORING LOUDLY.  A SIGN NEARBY READS: \"DO\nNOT DISTURB THE DWARVES!\"  AN IMMENSE MIRROR IS HANGING AGAINST ONE\nWALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER\nSUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANCE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE\nGIANT ROOM.  IT APPEARS TO BE A REPOSITORY FOR THE \"ADVENTURE\"\nPROGRAM.  MASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY\nYELLOW LIGHT.  SCATTERED ABOUT YOU CAN BE SEEN A PILE OF BOTTLES (ALL\nOF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED\nOF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND\nA COLLECTION OF BRASS LANTERNS.  OFF TO ONE SIDE A GREAT MANY DWARVES\nARE SLEEPING ON THE FLOOR, SNORING LOUDLY.  A SIGN NEARBY READS: \"DO\nNOT DISTURB THE DWARVES!\"  AN IMMENSE MIRROR IS HANGING AGAINST ONE\nWALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER\nSUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANCE.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\n>>> sw\nYOU ARE AT THE SOUTHWEST END OF THE REPOSITORY.  TO ONE SIDE IS A PIT\nFULL OF FIERCE GREEN SNAKES.  ON THE OTHER SIDE IS A ROW OF SMALL\nWICKER CAGES, EACH OF WHICH CONTAINS A LITTLE SULKING BIRD.  IN ONE\nCORNER IS A BUNDLE OF BLACK RODS WITH RUSTY MARKS ON THEIR ENDS.  A\nLARGE NUMBER OF VELVET PILLOWS ARE SCATTERED ABOUT ON THE FLOOR.  A\nVAST MIRROR STRETCHES OFF TO THE NORTHEAST.  AT YOUR FEET IS A LARGE\nSTEEL GRATE, NEXT TO WHICH IS A SIGN WHICH READS, \"TREASURE VAULT.\nKEYS IN MAIN OFFICE.\"\n<BLANKLINE>\n>>> get(bird)\nOK\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nWICKER CAGE\nLITTLE BIRD IN CAGE\n<BLANKLINE>\n>>> ne\nYOU'RE AT NE END.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\n>>> drop(bird)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE\nGIANT ROOM.  IT APPEARS TO BE A REPOSITORY FOR THE \"ADVENTURE\"\nPROGRAM.  MASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY\nYELLOW LIGHT.  SCATTERED ABOUT YOU CAN BE SEEN A PILE OF BOTTLES (ALL\nOF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED\nOF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND\nA COLLECTION OF BRASS LANTERNS.  OFF TO ONE SIDE A GREAT MANY DWARVES\nARE SLEEPING ON THE FLOOR, SNORING LOUDLY.  A SIGN NEARBY READS: \"DO\nNOT DISTURB THE DWARVES!\"  AN IMMENSE MIRROR IS HANGING AGAINST ONE\nWALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER\nSUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANCE.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\n>>> get(oyster)\nOK\n<BLANKLINE>\nINTERESTING.  THERE SEEMS TO BE SOMETHING WRITTEN ON THE UNDERSIDE OF\nTHE OYSTER.\n<BLANKLINE>\n>>> read\nHMMM, THIS LOOKS LIKE A CLUE, WHICH MEANS IT'LL COST YOU 10 POINTS TO\nREAD IT.  SHOULD I GO AHEAD AND READ IT ANYWAY?\n<BLANKLINE>\n>>> no\nOK\n<BLANKLINE>\n>>> shazam\nGOOD TRY, BUT THAT IS AN OLD WORN-OUT MAGIC WORD.\n<BLANKLINE>\n>>> sw\nYOU'RE AT SW END.\n<BLANKLINE>\n>>> get(rod)\nOK\n<BLANKLINE>\n>>> drop(rod)\nOK\n<BLANKLINE>\n>>> ne\nYOU'RE AT NE END.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\n>>> blast\nTHERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR\nWALL, BURYING THE SNAKES IN THE RUBBLE.  A RIVER OF MOLTEN LAVA POURS\nIN THROUGH THE HOLE, DESTROYING EVERYTHING IN ITS PATH, INCLUDING YOU!\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 278 OUT OF A POSSIBLE 350 USING 698 TURNS.\n<BLANKLINE>\nYOUR SCORE PUTS YOU IN MASTER ADVENTURER CLASS C.\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING, YOU NEED 53 MORE POINTS\n<BLANKLINE>\n"
  },
  {
    "path": "adventure/tests/walkthrough2.txt",
    "content": ">>> import adventure\n>>> adventure.play(seed=2)\nWELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?\n<BLANKLINE>\n>>> no\nYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\nAROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\nDOWN A GULLY.\n<BLANKLINE>\n>>> brief\nOKAY, FROM NOW ON I'LL ONLY DESCRIBE A PLACE IN FULL THE FIRST TIME\nYOU COME TO IT.  TO GET THE FULL DESCRIPTION, SAY \"LOOK\".\n<BLANKLINE>\n>>> enter\nYOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> xyzzy\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> on\nYOUR LAMP IS NOW ON.\n<BLANKLINE>\nYOU ARE IN A DEBRIS ROOM FILLED WITH STUFF WASHED IN FROM THE SURFACE.\nA LOW WIDE PASSAGE WITH COBBLES BECOMES PLUGGED WITH MUD AND DEBRIS\nHERE, BUT AN AWKWARD CANYON LEADS UPWARD AND WEST.  A NOTE ON THE WALL\nSAYS \"MAGIC WORD XYZZY\".\n<BLANKLINE>\nA THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARBY.\n<BLANKLINE>\n>>> get(rod)\nOK\n<BLANKLINE>\n>>> e\nYOU ARE CRAWLING OVER COBBLES IN A LOW PASSAGE.  THERE IS A DIM LIGHT\nAT THE EAST END OF THE PASSAGE.\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\n>>> get(cage)\nOK\n<BLANKLINE>\n>>> w\nYOU'RE IN DEBRIS ROOM.\n<BLANKLINE>\n>>> w\nYOU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON.\n<BLANKLINE>\n>>> w\nYOU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH.  THE WALLS ARE FROZEN\nRIVERS OF ORANGE STONE.  AN AWKWARD CANYON AND A GOOD PASSAGE EXIT\nFROM EAST AND WEST SIDES OF THE CHAMBER.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> drop(rod)\nOK\n<BLANKLINE>\n>>> get(bird)\nOK\n<BLANKLINE>\n>>> get(rod)\nOK\n<BLANKLINE>\n>>> w\nAT YOUR FEET IS A SMALL PIT BREATHING TRACES OF WHITE MIST.  AN EAST\nPASSAGE ENDS HERE EXCEPT FOR A SMALL CRACK LEADING ON.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> d\nYOU ARE AT ONE END OF A VAST HALL STRETCHING FORWARD OUT OF SIGHT TO\nTHE WEST.  THERE ARE OPENINGS TO EITHER SIDE.  NEARBY, A WIDE STONE\nSTAIRCASE LEADS DOWNWARD.  THE HALL IS FILLED WITH WISPS OF WHITE MIST\nSWAYING TO AND FRO ALMOST AS IF ALIVE.  A COLD WIND BLOWS UP THE\nSTAIRCASE.  THERE IS A PASSAGE AT THE TOP OF A DOME BEHIND YOU.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> d\nYOU ARE IN THE HALL OF THE MOUNTAIN KING, WITH PASSAGES OFF IN ALL\nDIRECTIONS.\n<BLANKLINE>\nA HUGE GREEN FIERCE SNAKE BARS THE WAY!\n<BLANKLINE>\n>>> drop(bird)\nTHE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN ASTOUNDING FLURRY\nDRIVES THE SNAKE AWAY.\n<BLANKLINE>\n>>> drop(cage)\nOK\n<BLANKLINE>\n>>> u\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> w\nYOU ARE ON THE EAST BANK OF A FISSURE SLICING CLEAR ACROSS THE HALL.\nTHE MIST IS QUITE THICK HERE, AND THE FISSURE IS TOO WIDE TO JUMP.\n<BLANKLINE>\n>>> swing(rod)\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\n>>> drop(rod)\nOK\n<BLANKLINE>\n>>> w\nYOU ARE ON THE WEST SIDE OF THE FISSURE IN THE HALL OF MISTS.\n<BLANKLINE>\nA CRYSTAL BRIDGE NOW SPANS THE FISSURE.\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\n>>> get(diamonds)\nOK\n<BLANKLINE>\n>>> w\nYOU ARE AT THE WEST END OF HALL OF MISTS.  A LOW WIDE CRAWL CONTINUES\nWEST AND ANOTHER GOES NORTH.  TO THE SOUTH IS A LITTLE PASSAGE 6 FEET\nOFF THE FLOOR.\n<BLANKLINE>\n>>> s\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> e\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> s\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> n\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> e\nA LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE\nAXE AT YOU WHICH MISSED, CURSED, AND RAN AWAY.\n<BLANKLINE>\nYOU ARE ON THE BRINK OF A THIRTY FOOT PIT WITH A MASSIVE ORANGE COLUMN\nDOWN ONE WALL.  YOU COULD CLIMB DOWN HERE BUT YOU COULD NOT GET BACK\nUP.  THE MAZE CONTINUES AT THIS LEVEL.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> e\nOUT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE!  \"HAR, HAR,\"\nHE CHORTLES, \"I'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME\nCHEST DEEP IN THE MAZE!\"  HE SNATCHES YOUR TREASURE AND VANISHES INTO\nTHE GLOOM.\n<BLANKLINE>\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> nw\nDEAD END\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\n>>> get(chest)\nOK\n<BLANKLINE>\n>>> get(diamonds)\nOK\n<BLANKLINE>\n>>> se\nYOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE.\n<BLANKLINE>\n>>> n\nYOU'RE AT BRINK OF PIT.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> d\nYOU'RE IN BIRD CHAMBER.\n<BLANKLINE>\n>>> w\nYOU'RE AT TOP OF SMALL PIT.\n<BLANKLINE>\nROUGH STONE STEPS LEAD DOWN THE PIT.\n<BLANKLINE>\n>>> d\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\n>>> throw(axe)\nYOU KILLED A LITTLE DWARF.  THE BODY VANISHES IN A CLOUD OF GREASY\nBLACK SMOKE.\n<BLANKLINE>\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nROUGH STONE STEPS LEAD UP THE DOME.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> s\nTHIS IS A LOW ROOM WITH A CRUDE NOTE ON THE WALL.  THE NOTE SAYS,\n\"YOU WON'T GET IT UP THE STEPS\".\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\n>>> get(gold)\nOK\n<BLANKLINE>\n>>> n\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\n>>> throw(axe)\nYOU KILLED A LITTLE DWARF.\n<BLANKLINE>\nYOU'RE IN HALL OF MISTS.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> d\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> w\nYOU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF THE MOUNTAIN KING.\nA PASSAGE CONTINUES WEST AND UP HERE.\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\n>>> get(coins)\nOK\n<BLANKLINE>\n>>> e\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> s\nYOU ARE IN THE SOUTH SIDE CHAMBER.\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\n>>> get(jewelry)\nOK\n<BLANKLINE>\n>>> n\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> drop(axe)\nOK\n<BLANKLINE>\n>>> sw\nYOU ARE IN A SECRET CANYON WHICH HERE RUNS E/W.  IT CROSSES OVER A\nVERY TIGHT CANYON 15 FEET BELOW.  IF YOU GO DOWN YOU MAY NOT BE ABLE\nTO GET BACK UP.\n<BLANKLINE>\n>>> w\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nA HUGE GREEN FIERCE DRAGON BARS THE WAY!\n<BLANKLINE>\nTHE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!!\n<BLANKLINE>\n>>> kill(dragon)\nWITH WHAT?  YOUR BARE HANDS?\n<BLANKLINE>\n>>> yes\nCONGRATULATIONS!  YOU HAVE JUST VANQUISHED A DRAGON WITH YOUR BARE\nHANDS!  (UNBELIEVABLE, ISN'T IT?)\n<BLANKLINE>\nYOU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST.\n<BLANKLINE>\nTHE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SIDE.\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\n>>> get(rug)\nOK\n<BLANKLINE>\n>>> e\nYOU'RE IN SECRET E/W CANYON ABOVE TIGHT CANYON.\n<BLANKLINE>\n>>> e\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> n\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> n\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> drop(gold)\nOK\n<BLANKLINE>\n>>> drop(diamonds)\nOK\n<BLANKLINE>\n>>> drop(jewelry)\nOK\n<BLANKLINE>\n>>> drop(coins)\nOK\n<BLANKLINE>\n>>> drop(chest)\nOK\n<BLANKLINE>\n>>> drop(rug)\nOK\n<BLANKLINE>\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> s\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> n\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> get(silver)\nOK\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plover\nYOU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT.  AN EXTREMELY\nNARROW TUNNEL EXITS TO THE WEST.  A DARK CORRIDOR LEADS NE.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\n>>> ne\nYOU'RE IN THE DARK-ROOM.  A CORRIDOR LEADING SOUTH IS THE ONLY EXIT.\n<BLANKLINE>\nA MASSIVE STONE TABLET IMBEDDED IN THE WALL READS:\n\"CONGRATULATIONS ON BRINGING LIGHT INTO THE DARK-ROOM!\"\n<BLANKLINE>\nTHERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SIDE!\n<BLANKLINE>\n>>> get(platinum)\nOK\n<BLANKLINE>\n>>> s\nYOU'RE IN PLOVER ROOM.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\n>>> plover\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\n>>> drop(silver)\nOK\n<BLANKLINE>\n>>> drop(platinum)\nOK\n<BLANKLINE>\n>>> get(keys)\nOK\n<BLANKLINE>\n>>> get(food)\nOK\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\nA HOLLOW VOICE SAYS \"PLUGH\".\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> d\nYOU ARE IN A DIRTY BROKEN PASSAGE.  TO THE EAST IS A CRAWL.  TO THE\nWEST IS A LARGE PASSAGE.  ABOVE YOU IS A HOLE TO ANOTHER PASSAGE.\n<BLANKLINE>\n>>> w\nYOU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS.  THERE IS A BIG HOLE IN\nTHE FLOOR.  THERE ARE CRACKS EVERYWHERE, AND A PASSAGE LEADING EAST.\n<BLANKLINE>\n>>> d\nYOU ARE AT A COMPLEX JUNCTION.  A LOW HANDS AND KNEES PASSAGE FROM THE\nNORTH JOINS A HIGHER CRAWL FROM THE EAST TO MAKE A WALKING PASSAGE\nGOING WEST.  THERE IS ALSO A LARGE ROOM ABOVE.  THE AIR IS DAMP HERE.\n<BLANKLINE>\n>>> w\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> w\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN A ROOM WHOSE WALLS RESEMBLE SWISS CHEESE.  OBVIOUS PASSAGES\nGO WEST, EAST, NE, AND NW.  PART OF THE ROOM IS OCCUPIED BY A LARGE\nBEDROCK BLOCK.\n<BLANKLINE>\n>>> oriental\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nTHIS IS THE ORIENTAL ROOM.  ANCIENT ORIENTAL CAVE DRAWINGS COVER THE\nWALLS.  A GENTLY SLOPING PASSAGE LEADS UPWARD TO THE NORTH, ANOTHER\nPASSAGE LEADS SE, AND A HANDS AND KNEES CRAWL LEADS WEST.\n<BLANKLINE>\nTHERE IS A DELICATE, PRECIOUS, MING VASE HERE!\n<BLANKLINE>\n>>> throw(axe)\nYOU KILLED A LITTLE DWARF.\n<BLANKLINE>\nYOU'RE IN ORIENTAL ROOM.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nTHERE IS A DELICATE, PRECIOUS, MING VASE HERE!\n<BLANKLINE>\n>>> n\nYOU ARE FOLLOWING A WIDE PATH AROUND THE OUTER EDGE OF A LARGE CAVERN.\nFAR BELOW, THROUGH A HEAVY WHITE MIST, STRANGE SPLASHING NOISES CAN BE\nHEARD.  THE MIST RISES UP THROUGH A FISSURE IN THE CEILING.  THE PATH\nEXITS TO THE SOUTH AND WEST.\n<BLANKLINE>\n>>> w\nYOU ARE IN AN ALCOVE.  A SMALL NW PATH SEEMS TO WIDEN AFTER A SHORT\nDISTANCE.  AN EXTREMELY TIGHT TUNNEL LEADS EAST.  IT LOOKS LIKE A VERY\nTIGHT SQUEEZE.  AN EERIE LIGHT CAN BE SEEN AT THE OTHER END.\n<BLANKLINE>\n>>> drop(keys)\nOK\n<BLANKLINE>\n>>> drop(lantern)\nOK\n<BLANKLINE>\n>>> drop(food)\nOK\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> e\nYOU'RE IN PLOVER ROOM.\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\n>>> get(emerald)\nOK\n<BLANKLINE>\n>>> w\nYOU'RE IN ALCOVE.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A LAMP SHINING NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(keys)\nOK\n<BLANKLINE>\n>>> get(lantern)\nOK\n<BLANKLINE>\n>>> get(food)\nOK\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> nw\nYOU'RE IN MISTY CAVERN.\n<BLANKLINE>\n>>> s\nYOU'RE IN ORIENTAL ROOM.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nTHERE IS A DELICATE, PRECIOUS, MING VASE HERE!\n<BLANKLINE>\n>>> se\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> w\nYOU ARE AT THE EAST END OF THE TWOPIT ROOM.  THE FLOOR HERE IS\nLITTERED WITH THIN ROCK SLABS, WHICH MAKE IT EASY TO DESCEND THE PITS.\nTHERE IS A PATH HERE BYPASSING THE PITS TO CONNECT PASSAGES FROM EAST\nAND WEST.  THERE ARE HOLES ALL OVER, BUT THE ONLY BIG ONE IS ON THE\nWALL DIRECTLY OVER THE WEST PIT WHERE YOU CAN'T GET TO IT.\n<BLANKLINE>\n>>> w\nYOU ARE AT THE WEST END OF THE TWOPIT ROOM.  THERE IS A LARGE HOLE IN\nTHE WALL ABOVE THE PIT AT THIS END OF THE ROOM.\n<BLANKLINE>\n>>> d\nYOU ARE AT THE BOTTOM OF THE WESTERN PIT IN THE TWOPIT ROOM.  THERE IS\nA LARGE HOLE IN THE WALL ABOUT 25 FEET ABOVE YOU.\n<BLANKLINE>\nTHERE IS A TINY LITTLE PLANT IN THE PIT, MURMURING \"WATER, WATER, ...\"\n<BLANKLINE>\n>>> pour(water)\nTHE PLANT SPURTS INTO FURIOUS GROWTH FOR A FEW SECONDS.\n<BLANKLINE>\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A 12-FOOT-TALL BEANSTALK STRETCHING UP OUT OF THE PIT,\nBELLOWING \"WATER!! WATER!!\"\n<BLANKLINE>\n>>> u\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHE TOP OF A 12-FOOT-TALL BEANSTALK IS POKING OUT OF THE WEST PIT.\n<BLANKLINE>\n>>> w\nYOU ARE IN A LARGE LOW CIRCULAR CHAMBER WHOSE FLOOR IS AN IMMENSE SLAB\nFALLEN FROM THE CEILING (SLAB ROOM).  EAST AND WEST THERE ONCE WERE\nLARGE PASSAGES, BUT THEY ARE NOW FILLED WITH BOULDERS.  LOW SMALL\nPASSAGES GO NORTH AND SOUTH, AND THE SOUTH ONE QUICKLY BENDS WEST\nAROUND THE BOULDERS.\n<BLANKLINE>\n>>> u\nYOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM.\n<BLANKLINE>\n>>> n\nYOU ARE IN A NORTH/SOUTH CANYON ABOUT 25 FEET ACROSS.  THE FLOOR IS\nCOVERED BY WHITE MIST SEEPING IN FROM THE NORTH.  THE WALLS EXTEND\nUPWARD FOR WELL OVER 100 FEET.  SUSPENDED FROM SOME UNSEEN POINT FAR\nABOVE YOU, AN ENORMOUS TWO-SIDED MIRROR IS HANGING PARALLEL TO AND\nMIDWAY BETWEEN THE CANYON WALLS.  (THE MIRROR IS OBVIOUSLY PROVIDED\nFOR THE USE OF THE DWARVES, WHO AS YOU KNOW, ARE EXTREMELY VAIN.)  A\nSMALL WINDOW CAN BE SEEN IN EITHER WALL, SOME FIFTY FEET UP.\n<BLANKLINE>\n>>> n\nYOU ARE AT THE EDGE OF A LARGE UNDERGROUND RESERVOIR.  AN OPAQUE CLOUD\nOF WHITE MIST FILLS THE ROOM AND RISES RAPIDLY UPWARD.  THE LAKE IS\nFED BY A STREAM, WHICH TUMBLES OUT OF A HOLE IN THE WALL ABOUT 10 FEET\nOVERHEAD AND SPLASHES NOISILY INTO THE WATER SOMEWHERE WITHIN THE\nMIST.  THE ONLY PASSAGE GOES BACK TOWARD THE SOUTH.\n<BLANKLINE>\n>>> get(water)\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> s\nYOU'RE IN MIRROR CANYON.\n<BLANKLINE>\n>>> s\nYOU ARE IN A SECRET N/S CANYON ABOVE A LARGE ROOM.\n<BLANKLINE>\n>>> d\nYOU'RE IN SLAB ROOM.\n<BLANKLINE>\n>>> s\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHE TOP OF A 12-FOOT-TALL BEANSTALK IS POKING OUT OF THE WEST PIT.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A 12-FOOT-TALL BEANSTALK STRETCHING UP OUT OF THE PIT,\nBELLOWING \"WATER!! WATER!!\"\n<BLANKLINE>\n>>> pour(water)\nTHE PLANT GROWS EXPLOSIVELY, ALMOST FILLING THE BOTTOM OF THE PIT.\n<BLANKLINE>\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> u\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> e\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> d\nYOU ARE AT THE BOTTOM OF THE EASTERN PIT IN THE TWOPIT ROOM.  THERE IS\nA SMALL POOL OF OIL IN ONE CORNER OF THE PIT.\n<BLANKLINE>\n>>> get(oil)\nYOUR BOTTLE IS NOW FULL OF OIL.\n<BLANKLINE>\n>>> u\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> w\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> climb\nYOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP.\n<BLANKLINE>\nYOU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT OF SIGHT TO THE\nWEST.  AT THE EASTERN END IS A HOLE THROUGH WHICH YOU CAN SEE A\nPROFUSION OF LEAVES.\n<BLANKLINE>\n>>> w\nYOU ARE IN THE GIANT ROOM.  THE CEILING HERE IS TOO HIGH UP FOR YOUR\nLAMP TO SHOW IT.  CAVERNOUS PASSAGES LEAD EAST, NORTH, AND SOUTH.  ON\nTHE WEST WALL IS SCRAWLED THE INSCRIPTION, \"FEE FIE FOE FOO\" [SIC].\n<BLANKLINE>\nTHERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS!\n<BLANKLINE>\n>>> get(eggs)\nOK\n<BLANKLINE>\n>>> n\nYOU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE.\n<BLANKLINE>\nTHE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR.\n<BLANKLINE>\n>>> pour(oil)\nTHE OIL HAS FREED UP THE HINGES SO THAT THE DOOR WILL NOW MOVE,\nALTHOUGH IT REQUIRES SOME EFFORT.\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> n\nYOU ARE IN A MAGNIFICENT CAVERN WITH A RUSHING STREAM, WHICH CASCADES\nOVER A SPARKLING WATERFALL INTO A ROARING WHIRLPOOL WHICH DISAPPEARS\nTHROUGH A HOLE IN THE FLOOR.  PASSAGES EXIT TO THE SOUTH AND WEST.\n<BLANKLINE>\nTHERE IS A JEWEL-ENCRUSTED TRIDENT HERE!\n<BLANKLINE>\n>>> get(trident)\nOK\n<BLANKLINE>\n>>> w\nYOU ARE AT THE TOP OF A STEEP INCLINE ABOVE A LARGE ROOM.  YOU COULD\nCLIMB DOWN HERE, BUT YOU WOULD NOT BE ABLE TO CLIMB UP.  THERE IS A\nPASSAGE LEADING BACK TO THE NORTH.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> sw\nYOU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF SIGHT IN BOTH\nDIRECTIONS.\n<BLANKLINE>\n>>> u\nYOU ARE ON ONE SIDE OF A LARGE, DEEP CHASM.  A HEAVY WHITE MIST RISING\nUP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE.  A SW PATH LEADS AWAY\nFROM THE CHASM INTO A WINDING CORRIDOR.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> throw(eggs)\nTHE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGHT.\n<BLANKLINE>\n>>> cross\nYOU ARE ON THE FAR SIDE OF THE CHASM.  A NE PATH LEADS AWAY FROM THE\nCHASM ON THIS SIDE.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> ne\nYOU'RE IN A LONG EAST/WEST CORRIDOR.  A FAINT RUMBLING NOISE CAN BE\nHEARD IN THE DISTANCE.\n<BLANKLINE>\n>>> e\nTHE PATH FORKS HERE.  THE LEFT FORK LEADS NORTHEAST.  A DULL RUMBLING\nSEEMS TO GET LOUDER IN THAT DIRECTION.  THE RIGHT FORK LEADS SOUTHEAST\nDOWN A GENTLE SLOPE.  THE MAIN CORRIDOR ENTERS FROM THE WEST.\n<BLANKLINE>\n>>> se\nYOU ARE WALKING ALONG A GENTLY SLOPING NORTH/SOUTH PASSAGE LINED WITH\nODDLY SHAPED LIMESTONE FORMATIONS.\n<BLANKLINE>\n>>> s\nYOU ARE STANDING AT THE ENTRANCE TO A LARGE, BARREN ROOM.  A SIGN\nPOSTED ABOVE THE ENTRANCE READS:  \"CAUTION!  BEAR IN ROOM!\"\n<BLANKLINE>\n>>> e\nYOU ARE INSIDE A BARREN ROOM.  THE CENTER OF THE ROOM IS COMPLETELY\nEMPTY EXCEPT FOR SOME DUST.  MARKS IN THE DUST LEAD AWAY TOWARD THE\nFAR END OF THE ROOM.  THE ONLY EXIT IS THE WAY YOU CAME IN.\n<BLANKLINE>\nTHERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE FAR END OF THE ROOM!\n<BLANKLINE>\nTHE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAIN!\n<BLANKLINE>\n>>> feed(bear)\nTHE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH HE SEEMS TO CALM\nDOWN CONSIDERABLY AND EVEN BECOMES RATHER FRIENDLY.\n<BLANKLINE>\n>>> unlock(chain)\nTHE CHAIN IS NOW UNLOCKED.\n<BLANKLINE>\n>>> drop(keys)\nOK\n<BLANKLINE>\n>>> get(chain)\nOK\n<BLANKLINE>\n>>> get(bear)\nOK\n<BLANKLINE>\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE IN FRONT OF BARREN ROOM.\n<BLANKLINE>\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE IN LIMESTONE PASSAGE.\n<BLANKLINE>\n>>> n\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE AT FORK IN PATH.\n<BLANKLINE>\n>>> ne\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nTHE WALLS ARE QUITE WARM HERE.  FROM THE NORTH CAN BE HEARD A STEADY\nROAR, SO LOUD THAT THE ENTIRE CAVE SEEMS TO BE TREMBLING.  ANOTHER\nPASSAGE LEADS SOUTH, AND A LOW CRAWL GOES EAST.\n<BLANKLINE>\n>>> e\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU ARE IN A SMALL CHAMBER FILLED WITH LARGE BOULDERS.  THE WALLS ARE\nVERY WARM, CAUSING THE AIR IN THE ROOM TO BE ALMOST STIFLING FROM THE\nHEAT.  THE ONLY EXIT IS A CRAWL HEADING WEST, THROUGH WHICH IS COMING\nA LOW RUMBLING.\n<BLANKLINE>\nTHERE ARE RARE SPICES HERE!\n<BLANKLINE>\n>>> get(spices)\nOK\n<BLANKLINE>\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE AT JUNCTION WITH WARM WALLS.\n<BLANKLINE>\n>>> s\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE AT FORK IN PATH.\n<BLANKLINE>\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE IN CORRIDOR.\n<BLANKLINE>\n>>> w\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE ON NE SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> sw\nTHE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR WAY.\n<BLANKLINE>\nYOU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR.\n<BLANKLINE>\nYOU'RE ON NE SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nA BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A\nTREASURE BEFORE YOU MAY CROSS.\n<BLANKLINE>\n>>> drop(bear)\nTHE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A STARTLED SHRIEK AND\nSCURRIES AWAY.  THE BEAR SOON GIVES UP THE PURSUIT AND WANDERS BACK.\n<BLANKLINE>\n>>> sw\nYOU'RE ON SW SIDE OF CHASM.\n<BLANKLINE>\nA RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE\nMIST.  A SIGN POSTED ON THE BRIDGE READS, \"STOP! PAY TROLL!\"\n<BLANKLINE>\nTHE TROLL IS NOWHERE TO BE SEEN.\n<BLANKLINE>\n>>> sw\nYOU'RE IN SLOPING CORRIDOR.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LARGE LOW ROOM.  CRAWLS LEAD NORTH, SE, AND SW.\n<BLANKLINE>\n>>> se\nYOU'RE IN ORIENTAL ROOM.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nTHERE IS A DELICATE, PRECIOUS, MING VASE HERE!\n<BLANKLINE>\n>>> se\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> w\nYOU'RE AT EAST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> w\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> climb\nYOU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP.\n<BLANKLINE>\nYOU'RE IN NARROW CORRIDOR.\n<BLANKLINE>\n>>> w\nYOU'RE IN GIANT ROOM.\n<BLANKLINE>\n>>> fee\nOK\n<BLANKLINE>\n>>> fie\nOK\n<BLANKLINE>\n>>> foe\nOK\n<BLANKLINE>\n>>> foo\nTHERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS!\n<BLANKLINE>\n>>> get(eggs)\nOK\n<BLANKLINE>\n>>> s\nYOU'RE IN NARROW CORRIDOR.\n<BLANKLINE>\n>>> d\nYOU'RE IN WEST PIT.\n<BLANKLINE>\nTHERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE.\n<BLANKLINE>\n>>> u\nYOU'RE AT WEST END OF TWOPIT ROOM.\n<BLANKLINE>\nTHERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE.\n<BLANKLINE>\n>>> w\nYOU'RE IN SLAB ROOM.\n<BLANKLINE>\n>>> n\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> e\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> n\nYOU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY ROCK.  THE FLOOR AND\nWALLS ARE LITTERED WITH BITS OF SHELLS IMBEDDED IN THE STONE.  A\nSHALLOW PASSAGE PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEADS\nUP.  A LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SOUTH.\n<BLANKLINE>\nTHERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED.\n<BLANKLINE>\n>>> unlock(clam)\nA GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS AWAY.  GOODNESS,\nTHIS MUST REALLY BE AN OYSTER.  (I NEVER WAS VERY GOOD AT IDENTIFYING\nBIVALVES.)  WHATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAIN.\n<BLANKLINE>\n>>> d\nYOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS.\n<BLANKLINE>\n>>> d\nYOU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET ACROSS.\n<BLANKLINE>\nOFF TO ONE SIDE LIES A GLISTENING PEARL!\n<BLANKLINE>\n>>> get(pearl)\nOK\n<BLANKLINE>\n>>> u\nYOU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS.\n<BLANKLINE>\n>>> u\nYOU'RE IN SHELL ROOM.\n<BLANKLINE>\nTHERE IS AN ENORMOUS OYSTER HERE WITH ITS SHELL TIGHTLY CLOSED.\n<BLANKLINE>\n>>> s\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> u\nYOU'RE IN DUSTY ROCK ROOM.\n<BLANKLINE>\n>>> e\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\nTHERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SIDE!\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\n>>> drop(eggs)\nOK\n<BLANKLINE>\n>>> drop(trident)\nOK\n<BLANKLINE>\n>>> drop(emerald)\nOK\n<BLANKLINE>\n>>> drop(pearl)\nOK\n<BLANKLINE>\n>>> drop(spices)\nOK\n<BLANKLINE>\n>>> drop(chain)\nOK\n<BLANKLINE>\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\nA HOLLOW VOICE SAYS \"PLUGH\".\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> d\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> w\nYOU'RE IN DUSTY ROCK ROOM.\n<BLANKLINE>\n>>> d\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> w\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> w\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> oriental\nYOU'RE IN ORIENTAL ROOM.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\nTHERE IS A DELICATE, PRECIOUS, MING VASE HERE!\n<BLANKLINE>\n>>> get(vase)\nOK\n<BLANKLINE>\n>>> se\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> e\nYOU ARE IN THE SOFT ROOM.  THE WALLS ARE COVERED WITH HEAVY CURTAINS,\nTHE FLOOR WITH A THICK PILE CARPET.  MOSS COVERS THE CEILING.\n<BLANKLINE>\nA SMALL VELVET PILLOW LIES ON THE FLOOR.\n<BLANKLINE>\n>>> get(pillow)\nOK\n<BLANKLINE>\n>>> w\nYOU'RE IN SWISS CHEESE ROOM.\n<BLANKLINE>\n>>> ne\nYOU ARE IN BEDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE.\nTO EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN.\n<BLANKLINE>\n>>> e\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> u\nYOU'RE IN DUSTY ROCK ROOM.\n<BLANKLINE>\n>>> e\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE IS A LARGE SPARKLING NUGGET OF GOLD HERE!\n<BLANKLINE>\nTHERE ARE DIAMONDS HERE!\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\nTHERE IS PRECIOUS JEWELRY HERE!\n<BLANKLINE>\nTHERE ARE MANY COINS HERE!\n<BLANKLINE>\nTHE PIRATE'S TREASURE CHEST IS HERE!\n<BLANKLINE>\nTHERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS!\n<BLANKLINE>\nTHERE IS A JEWEL-ENCRUSTED TRIDENT HERE!\n<BLANKLINE>\nTHERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG!\n<BLANKLINE>\nTHERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SIDE!\n<BLANKLINE>\nOFF TO ONE SIDE LIES A GLISTENING PEARL!\n<BLANKLINE>\nTHERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR!\n<BLANKLINE>\nTHERE ARE RARE SPICES HERE!\n<BLANKLINE>\nTHERE IS A GOLDEN CHAIN LYING IN A HEAP ON THE FLOOR!\n<BLANKLINE>\n>>> drop(pillow)\nOK\n<BLANKLINE>\n>>> drop(vase)\nTHE VASE IS NOW RESTING, DELICATELY, ON A VELVET PILLOW.\n<BLANKLINE>\n>>> adventure._game.clock1\n5\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> s\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> s\nYOU ARE IN THE SOUTH SIDE CHAMBER.\n<BLANKLINE>\n>>> n\nYOU'RE IN HALL OF MT KING\n<BLANKLINE>\nTHERE IS A SMALL WICKER CAGE DISCARDED NEARBY.\n<BLANKLINE>\nA CHEERFUL LITTLE BIRD IS SITTING HERE SINGING.\n<BLANKLINE>\n>>> n\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nA SEPULCHRAL VOICE REVERBERATING THROUGH THE CAVE, SAYS, \"CAVE CLOSING\nSOON.  ALL ADVENTURERS EXIT IMMEDIATELY THROUGH MAIN OFFICE.\"\n<BLANKLINE>\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plugh\nA MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES:\n   \"THIS EXIT IS CLOSED.  PLEASE LEAVE VIA MAIN OFFICE.\"\n<BLANKLINE>\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> d\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> w\nYOU'RE IN DUSTY ROCK ROOM.\n<BLANKLINE>\n>>> d\nYOU'RE AT COMPLEX JUNCTION.\n<BLANKLINE>\n>>> e\nYOU ARE IN AN ANTEROOM LEADING TO A LARGE PASSAGE TO THE EAST.  SMALL\nPASSAGES GO WEST AND UP.  THE REMNANTS OF RECENT DIGGING ARE EVIDENT.\nA SIGN IN MIDAIR HERE SAYS \"CAVE UNDER CONSTRUCTION BEYOND THIS POINT.\nPROCEED AT OWN RISK.  [WITT CONSTRUCTION COMPANY]\"\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> get(magazine)\nOK\n<BLANKLINE>\n>>> e\nYOU ARE AT WITT'S END.  PASSAGES LEAD OFF IN *ALL* DIRECTIONS.\n<BLANKLINE>\n>>> drop(magazine)\nOK\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> n\nYOU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE\nMAIN PASSAGE.\n<BLANKLINE>\nYOU'RE AT WITT'S END.\n<BLANKLINE>\nTHERE ARE A FEW RECENT ISSUES OF \"SPELUNKER TODAY\" MAGAZINE HERE.\n<BLANKLINE>\n>>> n\nTHE SEPULCHRAL VOICE ENTONES, \"THE CAVE IS NOW CLOSED.\"  AS THE ECHOES\nFADE, THERE IS A BLINDING FLASH OF LIGHT (AND A SMALL PUFF OF ORANGE\nSMOKE). . . .    AS YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND...\n<BLANKLINE>\nYOU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE\nGIANT ROOM.  IT APPEARS TO BE A REPOSITORY FOR THE \"ADVENTURE\"\nPROGRAM.  MASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY\nYELLOW LIGHT.  SCATTERED ABOUT YOU CAN BE SEEN A PILE OF BOTTLES (ALL\nOF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED\nOF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND\nA COLLECTION OF BRASS LANTERNS.  OFF TO ONE SIDE A GREAT MANY DWARVES\nARE SLEEPING ON THE FLOOR, SNORING LOUDLY.  A SIGN NEARBY READS: \"DO\nNOT DISTURB THE DWARVES!\"  AN IMMENSE MIRROR IS HANGING AGAINST ONE\nWALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER\nSUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANCE.\n<BLANKLINE>\n>>> sw\nYOU ARE AT THE SOUTHWEST END OF THE REPOSITORY.  TO ONE SIDE IS A PIT\nFULL OF FIERCE GREEN SNAKES.  ON THE OTHER SIDE IS A ROW OF SMALL\nWICKER CAGES, EACH OF WHICH CONTAINS A LITTLE SULKING BIRD.  IN ONE\nCORNER IS A BUNDLE OF BLACK RODS WITH RUSTY MARKS ON THEIR ENDS.  A\nLARGE NUMBER OF VELVET PILLOWS ARE SCATTERED ABOUT ON THE FLOOR.  A\nVAST MIRROR STRETCHES OFF TO THE NORTHEAST.  AT YOUR FEET IS A LARGE\nSTEEL GRATE, NEXT TO WHICH IS A SIGN WHICH READS, \"TREASURE VAULT.\nKEYS IN MAIN OFFICE.\"\n<BLANKLINE>\n>>> get(rod)\nOK\n<BLANKLINE>\n>>> ne\nYOU'RE AT NE END.\n<BLANKLINE>\n>>> drop(rod)\nOK\n<BLANKLINE>\n>>> sw\nYOU'RE AT SW END.\n<BLANKLINE>\n>>> blast\nTHERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR\nWALL, BURYING THE DWARVES IN THE RUBBLE.  YOU MARCH THROUGH THE HOLE\nAND FIND YOURSELF IN THE MAIN OFFICE, WHERE A CHEERING BAND OF\nFRIENDLY ELVES CARRY THE CONQUERING ADVENTURER OFF INTO THE SUNSET.\n<BLANKLINE>\n<BLANKLINE>\nYOU SCORED 350 OUT OF A POSSIBLE 350 USING 266 TURNS.\n<BLANKLINE>\nALL OF ADVENTUREDOM GIVES TRIBUTE TO YOU, ADVENTURER GRANDMASTER!\n<BLANKLINE>\nTO ACHIEVE THE NEXT HIGHER RATING WOULD BE A NEAT TRICK!\n<BLANKLINE>\nCONGRATULATIONS!!\n<BLANKLINE>\n"
  },
  {
    "path": "adventure/tests/walkthrough3.txt",
    "content": ">>> import adventure\n>>> adventure.play(seed=4)\nWELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?\n<BLANKLINE>\n>>> no\nYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\nAROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\nDOWN A GULLY.\n<BLANKLINE>\n>>> enter\nYOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(water)\nOK\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> plugh\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\nA HOLLOW VOICE SAYS \"PLUGH\".\n<BLANKLINE>\n>>> on\nYOUR LAMP IS NOW ON.\n<BLANKLINE>\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> d\nYOU ARE IN A DIRTY BROKEN PASSAGE.  TO THE EAST IS A CRAWL.  TO THE\nWEST IS A LARGE PASSAGE.  ABOVE YOU IS A HOLE TO ANOTHER PASSAGE.\n<BLANKLINE>\n>>> e\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> drop(water)\nOK\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> pour(water)\nYOU AREN'T CARRYING IT!\n<BLANKLINE>\n>>> get(water)\nOK\n<BLANKLINE>\n>>> pour(water)\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\nSMALL BOTTLE\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> d\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\n>>> get(water)\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> drop(water)\nOK\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(water)\nOK\n<BLANKLINE>\n>>> u\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> w\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> pour(water)\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> drop(water)\nI SEE NO WATER HERE.\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN A DIRTY BROKEN PASSAGE.  TO THE EAST IS A CRAWL.  TO THE\nWEST IS A LARGE PASSAGE.  ABOVE YOU IS A HOLE TO ANOTHER PASSAGE.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> e\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> d\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\n>>> get(water)\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> drop(water)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(water)\nOK\n<BLANKLINE>\n>>> u\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> w\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> get(silver)\nOK\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\n>>> drop(silver)\nOK\n<BLANKLINE>\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> pour(water)\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> d\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> e\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> d\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\n>>> get(water)\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> u\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> w\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> w\nYOU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS.  THERE IS A BIG HOLE IN\nTHE FLOOR.  THERE ARE CRACKS EVERYWHERE, AND A PASSAGE LEADING EAST.\n<BLANKLINE>\n>>> e\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> e\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> w\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> n\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> s\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> nw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nA LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE\nAXE AT YOU WHICH MISSED, CURSED, AND RAN AWAY.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> w\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> e\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> d\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> e\nA LITTLE DWARF WITH A BIG KNIFE BLOCKS YOUR WAY.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> look\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT GETS YOU!\n<BLANKLINE>\nOH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED.  I MIGHT BE ABLE TO\nHELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS BEFORE.  DO YOU WANT ME\nTO TRY TO REINCARNATE YOU?\n<BLANKLINE>\n>>> yes\nALL RIGHT.  BUT DON'T BLAME ME IF SOMETHING GOES WR......\n                    --- POOF!! ---\nYOU ARE ENGULFED IN A CLOUD OF ORANGE SMOKE.  COUGHING AND GASPING,\nYOU EMERGE FROM THE SMOKE AND FIND....\n<BLANKLINE>\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> exit\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> enter\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> plugh\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> on\nYOUR LAMP IS NOW ON.\n<BLANKLINE>\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> pour\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> pour\nPOUR WHAT?\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n"
  },
  {
    "path": "adventure/tests/walkthrough4.txt",
    "content": ">>> import adventure\n>>> adventure.play(seed=4)\nWELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?\n<BLANKLINE>\n>>> no\nYOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.\nAROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND\nDOWN A GULLY.\n<BLANKLINE>\n>>> enter\nYOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(water)\nOK\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> plugh\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\nA HOLLOW VOICE SAYS \"PLUGH\".\n<BLANKLINE>\n>>> on\nYOUR LAMP IS NOW ON.\n<BLANKLINE>\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> d\nYOU ARE IN A DIRTY BROKEN PASSAGE.  TO THE EAST IS A CRAWL.  TO THE\nWEST IS A LARGE PASSAGE.  ABOVE YOU IS A HOLE TO ANOTHER PASSAGE.\n<BLANKLINE>\n>>> e\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> drop(water)\nOK\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> pour(water)\nYOU AREN'T CARRYING IT!\n<BLANKLINE>\n>>> get(water)\nOK\n<BLANKLINE>\n>>> pour(water)\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> inventory\nYOU ARE CURRENTLY HOLDING THE FOLLOWING:\n<BLANKLINE>\nBRASS LANTERN\nSMALL BOTTLE\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> d\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\n>>> get(water)\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> drop(water)\nOK\n<BLANKLINE>\n>>> look\nSORRY, BUT I AM NOT ALLOWED TO GIVE MORE DETAIL.  I WILL REPEAT THE\nLONG DESCRIPTION OF YOUR LOCATION.\n<BLANKLINE>\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(water)\nOK\n<BLANKLINE>\n>>> u\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> w\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> pour(water)\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> drop(water)\nI SEE NO WATER HERE.\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN A DIRTY BROKEN PASSAGE.  TO THE EAST IS A CRAWL.  TO THE\nWEST IS A LARGE PASSAGE.  ABOVE YOU IS A HOLE TO ANOTHER PASSAGE.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> e\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> d\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\n>>> get(water)\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> drop(water)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(water)\nOK\n<BLANKLINE>\n>>> u\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> w\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> get(silver)\nOK\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> plugh\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\n>>> drop(silver)\nOK\n<BLANKLINE>\n>>> plugh\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\nTHERE IS A BOTTLE OF WATER HERE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> pour(water)\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> s\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> d\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> e\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> d\nYOU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH\nENTERS AND EXITS THROUGH TINY SLITS.\n<BLANKLINE>\n>>> get(water)\nYOUR BOTTLE IS NOW FULL OF WATER.\n<BLANKLINE>\n>>> u\nYOU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT.  A CRAWL LEADS\nWEST.\n<BLANKLINE>\n>>> w\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> w\nYOU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS.  THERE IS A BIG HOLE IN\nTHE FLOOR.  THERE ARE CRACKS EVERYWHERE, AND A PASSAGE LEADING EAST.\n<BLANKLINE>\n>>> e\nYOU'RE IN DIRTY PASSAGE.\n<BLANKLINE>\n>>> u\nYOU ARE IN A LOW N/S PASSAGE AT A HOLE IN THE FLOOR.  THE HOLE GOES\nDOWN TO AN E/W PASSAGE.\n<BLANKLINE>\n>>> n\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> e\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> w\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> n\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> s\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> nw\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nA LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE\nAXE AT YOU WHICH MISSED, CURSED, AND RAN AWAY.\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(axe)\nOK\n<BLANKLINE>\n>>> w\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> e\nTHERE IS NO WAY TO GO THAT DIRECTION.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE.\n<BLANKLINE>\n>>> d\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> e\nA LITTLE DWARF WITH A BIG KNIFE BLOCKS YOUR WAY.\n<BLANKLINE>\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU'RE AT \"Y2\".\n<BLANKLINE>\n>>> pour(water)\nYOUR BOTTLE IS EMPTY AND THE GROUND IS WET.\n<BLANKLINE>\n>>> look\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT MISSES!\n<BLANKLINE>\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\n>>> look\nTHERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU!\n<BLANKLINE>\nONE SHARP NASTY KNIFE IS THROWN AT YOU!\n<BLANKLINE>\nIT GETS YOU!\n<BLANKLINE>\nOH DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED.  I MIGHT BE ABLE TO\nHELP YOU OUT, BUT I'VE NEVER REALLY DONE THIS BEFORE.  DO YOU WANT ME\nTO TRY TO REINCARNATE YOU?\n<BLANKLINE>\n>>> yes\nALL RIGHT.  BUT DON'T BLAME ME IF SOMETHING GOES WR......\n                    --- POOF!! ---\nYOU ARE ENGULFED IN A CLOUD OF ORANGE SMOKE.  COUGHING AND GASPING,\nYOU EMERGE FROM THE SMOKE AND FIND....\n<BLANKLINE>\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> exit\nYOU'RE AT END OF ROAD AGAIN.\n<BLANKLINE>\nTHERE IS A SHINY BRASS LAMP NEARBY.\n<BLANKLINE>\n>>> get(lamp)\nOK\n<BLANKLINE>\n>>> enter\nYOU'RE INSIDE BUILDING.\n<BLANKLINE>\nTHERE ARE SOME KEYS ON THE GROUND HERE.\n<BLANKLINE>\nTHERE IS FOOD HERE.\n<BLANKLINE>\nTHERE ARE BARS OF SILVER HERE!\n<BLANKLINE>\n>>> plugh\nIT IS NOW PITCH DARK.  IF YOU PROCEED YOU WILL LIKELY FALL INTO A PIT.\n<BLANKLINE>\n>>> on\nYOUR LAMP IS NOW ON.\n<BLANKLINE>\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n>>> get(bottle)\nOK\n<BLANKLINE>\n>>> pour\nPOUR WHAT?\n<BLANKLINE>\n>>> pour\nPOUR WHAT?\n<BLANKLINE>\n>>> drop(bottle)\nOK\n<BLANKLINE>\n>>> look\nYOU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE\nWEST, AND A WALL OF BROKEN ROCK TO THE EAST.  THERE IS A LARGE \"Y2\" ON\nA ROCK IN THE ROOM'S CENTER.\n<BLANKLINE>\nTHERE IS AN EMPTY BOTTLE HERE.\n<BLANKLINE>\nTHERE IS A LITTLE AXE HERE.\n<BLANKLINE>\n"
  },
  {
    "path": "setup.py",
    "content": "import os\nimport sys\nfrom distutils.core import setup\n\nif sys.version_info < (3,):\n    print('\\nSorry, but Adventure can only be installed under Python 3.\\n')\n    sys.exit(1)\n\nREADME_PATH = os.path.join(os.path.dirname(__file__), 'adventure', 'README.txt')\nwith open(README_PATH, encoding=\"utf-8\") as f:\n    README_TEXT = f.read()\n\nsetup(\n    name='adventure',\n    version='1.6',\n    description='Colossal Cave adventure game at the Python prompt',\n    long_description=README_TEXT,\n    author='Brandon Craig Rhodes',\n    author_email='brandon@rhodesmill.org',\n    url='https://github.com/brandon-rhodes/python-adventure',\n    packages=['adventure', 'adventure/tests'],\n    package_data={'adventure': ['README.txt', '*.dat', 'tests/*.txt']},\n    classifiers=[\n        'Development Status :: 6 - Mature',\n        'Environment :: Console',\n        'Intended Audience :: End Users/Desktop',\n        'License :: OSI Approved :: Apache Software License',\n        'Programming Language :: Python :: 3',\n        'Programming Language :: Python :: 3.2',\n        'Topic :: Games/Entertainment',\n    ],\n)\n"
  }
]