Continue working on ODWY0501: verbs BRIEF, TERSE, DIAGNOSE.

Implemented more of the "main loop" logic: the cameo event
that gives you the magic word PHUCE, the "chased by Wumpus"
messages, and death by radiation poisoning.

Verbs BRIEF/UNBRIEF and TERSE/UNTERSE, with accompanying logic
in look_around().

Verb DIAGNOSE, and the supporting global variable "health".
Continue working on ODWY0501: safe-cracking.

Implement the verbs 7, 22, 34 (collectively "COMBO").
This incantation works just like FEE, FIE, FOE, FOO.

Initially place the rare book in the safe. This has to be
done with an explicit call to insert(), since the book is
created before the safe.

Fix the indentation logic. I had foolishly used puts("")
to mean "indent N spaces prior to printing something with
printf", which of course doesn't work because puts() adds
a newline! So now I've replaced that throughout with a new
function indent_appropriately(). It's still called much less
often than my old indent_if_needed().
Continue working on ODWY0501: verbs FEE FIE FOE FOO (and FUM).

This logic is almost an exact copy of the COMBO logic.
Unfortunately the two functions attempt_{feefie,combo} are
different enough that there's not much point in trying to
combine them.
Continue working on ODWY0501: SWEEP, BLAST, clocks.

Long's game adds a third clock to Woods' two. The third
clock counts down a random number of turns (between 20 and 40)
when you're in the repository; at the end of that timer the
phone begins to ring, and seven turns later the dwarves are
awakened by the noise --- game over.

I've removed the wizmode commands WIZ, MAP, GATE, and PIRLOC;
these are implemented in MCDO0551 but WIZ's implementation
is commented out so that there is no way to get into wizmode.
This means that all MAP, GATE, and PIRLOC will do is print
"OK" (that is, what they do outside of wizmode).
Continue working on ODWY0501: verbs EXTINGUISH and WAVE.

Also some more Wumpus stuff and cave-closing stuff.

I've noticed that Long's "close the cave" logic is identical
to Woods', except that Long also closes the elfin door. (He
forgets to lock it, but I've fixed that.) Long doesn't kill
the sleeping dog or the chattering gnome. But then, Woods
didn't kill the dragon either, so I guess that's okay.
Remove debugging printfs from "getwds.c".

The game is now basically playable, although it's still missing
a couple of large pieces, such as dwarf movement and attacking.
Enable dwarves and pirate; put linebreaks in the right places.

Long's version puts the blank lines in different places from
Knuth's port of WOOD0350. I have not checked whether this was
a change by Knuth or by Long.

There are still several TODOs, including things like BLOW HORN
required for a complete walkthrough, but the game is basically
playable at this point.
Continue working on ODWY0501: BLOW, PLAY, DIAL, CALL, bugfixes.

I've realized that Long's room R_ESHORT is completely unnecessary.
It is inaccessible, both by the player and by the dwarves, except
that the player can get there by exploiting the cask bug:
PUT CROWN IN CASK gives you the ruby slippers prematurely, which
enables you to enter the Gothic Cathedral section via the Rainbow
Room. Since I'm not emulating the cask bug, there's no way to see
R_ESHORT, and therefore I've removed it from my port of the game
(to save space).

The ECHO object therefore doesn't need to be schizoid; I've
removed the ECHO_ object.

I'd mistakenly added a DUSTY_ROCKS object in my first pass; really,
the dusty ROCKS are just a synonym for the CARVING, and don't have
a separate noun in Long's game.

Long fiddles with PROP(POLE) in several places, but I think this
is unnecessary. PROP(BOAT) is the important variable as far as
the travel table is concerned.

I've factored out wake_the_wumpus() and remobilize_axe().  I use
the latter function consistently, even though Long doesn't always
check the axe's location before remobilizing it. (For example, if
you throw the axe at the bear and then calm the dog, the axe will
be mobile the next time you visit the barren room.) I consider
this a bugfix.

I've decided to prohibit putting the pole inside the chest, so
as to get rid of that loophole in Long's general "can't be in
the boat without the pole" invariant. This is a bugfix similar
in justification to my prohibition on putting the bear inside
the chest (albeit not as much fun to exploit).
Feature-complete on ODWY0501: verbs PICK, PUT, and TURN.

Long's "PUT X ON Y" logic is buggy; he creates a dichotomy
between objects that are wearable and those that are
non-wearable, and then treats the command as WEAR or DROP
respectively. And he does this *after* replacing "obj" with
"iobj". So "PUT AXE ON CLOAK" will drop the axe, but
"PUT AXE ON LAMP" will give a snarky response. Again, some
of Long's logic appears to be not just buggy but backwards.
I've fixed the logic.

I've decided that the TURN logic reads more cleanly if I
prohibit TURN LAMP ON LAMP. Long allowed that phrasing, in
addition to TURN LAMP ON and TURN ON LAMP. However, Long
doesn't allow a simple TURN ON or TURN OFF, even though he
helpfully redirects a simple LIGHT to LIGHT LAMP. (Long
also removes Woods' simple one-word ON and OFF commands,
which is slightly annoying.)

The game is now theoretically winnable, although I haven't
verified this myself. I know there is still a bug in the
parser's "Please clarify" logic: entering GET yields "Get
what?", but then answering LAMP doesn't correctly redirect
to GET LAMP. This may be the effect of a misplaced clrlin().
Various small bugfixes.

Investigate the deal with "CONTINUE" as a motion-word and an
action-word, and get it working (although my method of getting
it working is ad-hoc and doesn't emulate Long's logic at all.
Long's logic is still mysterious to me). Ditto "TREE" and "WALL".

Properly initialize the prop values of POLE and TINY_KEY, and
drop their prop values back to 0 in jostle_object().

Properly initialize the flags of lockable and closeable objects.

Long's game starts two of the five dwarves in locations different
from where Woods had them: R_ROTUNDA instead of R_WFISS and
R_SHELL instead of R_COMPLEX.
More bugfixes, mostly in getwds().

The "please_clarify" codepath now works, where it had been
buggy before. Reversal of nouns and verbs works: "LAMP GET".
Multiple verbs works: "GET AND EAT FOOD".

Also, my unless_prop test for moving past the dog had been
backwards. This is now fixed.
More bugfixes: Wumpus-related bugs.

The Wumpus puzzle wasn't reachable because I'd forgotten
to add the new exits to R_ELONG. Also, the cloak wasn't
listed as a treasure, so it didn't get its prop value
correctly initialized to 2. Also, the logic for
TAKE CLOAK was missing.

WEARing a carried object should respond with "OK."

I've also deliberately changed the "DROP VASE" output.
In Long's version, it reads:

    >drop pillow, vase
    Velvet pillow
         Dropped.
    The vase is now resting, delicately, on a velvet pillow.
    Ming vase
         Dropped.

In my version, it now reads:

    > drop pillow, vase
    Velvet pillow
        Dropped.
    Ming vase
        The vase is now resting, delicately, on a velvet pillow.

That is, I omit the redundant "Dropped." Ditto for dropping
the bear at the bridge.
Fix Alice/bear-related bugs.

The problem with getting past the dog was that DOG was 102,
which the travel table couldn't handle. I've bumped the modulus
up from 100 to 1000 to fix this.

Added some extra blank lines to the Alice shrink/grow messages,
even though Long's version didn't have them; it just looks a
lot better. Also fixed a grammatical error in a room description.

I'd missed marking a lot of rooms as "forced", which was a
huge error.

The water_at() predicate incorrectly included R_EPIT and
R_WINERY, because I'd blindly copied Long's "liquid at"
predicate and forgot to remove those. This made it impossible
to interact with the wine.

The PHUCE transition was totally broken. It's better now.

Remove trailing whitespace and turn spaces to tabs throughout.

The parser codepath for "THROW BEAR FOOD" doesn't seem to work;
I need to investigate this further.

The BOAT and BEAR don't go through the normal "GET ____" codepath,
but they still contribute to burden(0), so they must be included
in the weight() switch statement. The symptom was an assert(false)
the next time you tried to pick up something.
Fix a ton of bugs found in playtesting.

Incorrect spelling "oyste" instead of "oyster".
Player should be unable to climb out of R_HMK with the nugget.
Entrance to the Mountain King's private chamber was missing.
Entrance to the dragon canyon had the wrong probability.
Wrong initial position for TRIDENT.
YANK SWORD didn't properly set its prop value to 0.
WEAR X didn't properly set X's prop value to 1.
Added (non-original) blank lines after several more transition
  messages.
Wrong initial prop value for RING.
Better fixes for some original bugs in the FIND logic.
Fix an off-by-one in my kaleidoscope logic.
Fix my breakage of the "THROW BEAR FOOD" parser logic.
The FLOWERS are not a treasure. Whoops!

Fix several original bugs related to crossing a wrecked troll bridge.
Fix an original bug that prevented parsing GET AXE AND BRASS LAMP.
Fix an original bug that DOG and WUMPUS weren't "living", which
  meant that all that cute "FEED WUMPUS" code was unreachable.
  It is now reachable, as is "FEED DOG".

My parser code currently handles GET AND TURN ON LAMP,
but I don't understand why Long's doesn't and why mine does.
TODO: investigate this.
Fix a few treasure-related bugs found in playtesting.

Killing the dragon assert-failed in shift_words(); this faulty
assertion is now fixed.

The pirate's chest is always ajar (and not hinged).

Ajar objects should have their contents described in the room
description. This notably applies to the chest and the safe.

The maximum number of points per treasure is 5*QK(3),
not 7*QK(3) as I had mistakenly had it.

Points should be awarded for the cask only when it contains
wine (prop value 4); this was a typo on my part.
Fix some mostly endgame-related bugs found in playtesting.

I had an off-by-one in the travel table's size (and the assertion that
was supposed to keep us within the bounds of the travel table). The
symptom was that R_DIDIT's forced move overran the end of the table
and came out as a forced move to 0 (R_LIMBO), which means death.

A period was missing from the Witt's End description.

The repository descriptions hadn't been updated from Woods' version;
Long's version has a phone booth and a rare book mentioned in the
room descriptions. Long's repository also allows the movement verbs
CROSS and ACROSS, and I was missing the travel table entries for
entering the phone booth, which is required in order to win.

The initial "tally" of treasures hadn't been updated from 15 to
Long's 30.

Add more cosmetic blank lines to end-of-game transitions.

Fix a bug in look_around() that caused crashes in the repository.

Fix my buggy translation of Long's BLAST logic.
Add missing descriptions of the little axe.
Don't allow exploits "PUT (CLOAK|SWORD) IN SACK".

Long's version allows "PUT SWORD IN SACK" to bypass the puzzle
logic; I've fixed this original bug.

My version accidentally failed to make the trapped cloak
immobile, which meant that I could "PUT CLOAK IN SACK" (a
non-original bug). This is now fixed per Long's logic.

Long has Woods' "two foot hole"; I've made the same grammar
fix here as Knuth did in Woods' version.

Commented on the schizoid CLOAKROOM_ROCKS (an original bug),
but did not preserve the original bug.

The oily sword should be immobilized, or else "GET SWORD"
will incorrectly work on an oily sword. This non-original
bug is now fixed.
Fix the next round of bugs found in playtesting.

Long had "echos"; I've fixed it to "echoes".

Long and Woods have "inward"; Knuth changed it to "inwards";
I've changed it back.

The lamp should not give light when it's not "at hand" (namely,
when it's inside a closed sack or chest). This is now fixed.

Long incorrectly printed "You aren't carrying it!" in response
to "WAVE TO FIGURE"; but my code assert-failed instead. This
is now fixed properly. ("Nothing happens.")

My code assert-failed on an input line beginning with "ALL".
It now handles "GET" ("Get what?") "ALL" in the same way that
Long does, but it has arcane differences. TODO: fix these.
Comment on burden() issues; fix an original bug.

Long's original "burden(0)" had issues with recursion, but my
replacement was totally broken due to my mixing up of burden()
and weight(). This new "burden" routine should have much saner
behavior.

Also, comment on some known "features" of Long's PUT logic:
it's possible to PUT X IN Y when X is too heavy to carry
normally, even when Y is currently being carried. I believe
this was an intentional feature of the game logic, to make it
easier for the expert.

The boat should never be "too heavy" to enter. This was an
original bug, now fixed.