Expand the README for "Adventure 6" (MCDO0551).
Refactor "message words"; dispose of the message[] array.

Each message-word ("swim", "trees", "dig", etc.) now has an
enumerator (SWIM, TREES, DIG, etc.), just like the other
types of words. This gets us one step closer to being able
to put all the words into one big enumeration. Also, as a
short-term benefit, I was able to dispose of the message[]
array once and for all.
Add an exclamation mark, and remove extra spaces.

Two of Woods' helpful messages have four spaces after the
period. I'm normalizing them to match the two spaces used
in all other messages.

The message for two or more unfriendly dwarves in the room
with you is strangely apathetic, compared to the message for
only one dwarf. (I guess after the first dwarf, they start
getting old.) I've jazzed it up with an exclamation mark,
essentially restoring one of Knuth's grammar tweaks.

Of course, the original messages remain untouched in the
"original-bugs" branch.
Decouple object-words from zero-based array indices.

ObjectWord enumerators are used for their numerical values
in two places: the objs[] array and the "cond" field of the
travel table. Subtract MIN_OBJ from the index in each case;
this will enable us to shift the ObjectWord enumerators up
so that we can fold all of the *Words into one big enumeration.
De-overlap the *Word enums; SOUTH no longer equals KEYS.

Most of the necessary changes were squashed into my previous
commit. However, one sneaky thing Knuth did was the assignment

    obj = *word2;

This looks nonsensical at first, but in fact it's punning on
the fact that *word2 is '\0' iff there are no more words on
the line, and 0 happens to be NOTHING, and we follow this line
with a test that only cares if obj is NOTHING or non-NOTHING;
the exact value of obj doesn't matter.

I've fixed this by inlining more of the logic, and will clean
it up a little more in my next commit too.
Refactor to remove some gotos.

Eventually, I'd like to dispose of Knuth's pseudo-global "k"
altogether. I'm getting closer...

I just noticed that my refactoring in the last several commits
quietly fixed a major bug that I introduced into Knuth's code
by leaving out an apparently redundant sanity-check in this
codepath. Knuth's CWEB code carefully checks that the class
of k is WordType_Action before doing the FEEFIE case. Since I
left that check out, the controlled codepath would run whenever
k's "meaning" was numerically equal to FEEFIE (i.e., 24).
Prior to my refactorings, WATER equaled FEEFIE, and typing
the command "SAY WATER" would crash the game. After the
refactorings, the check truly is redundant, and SAY WATER
correctly prints the response

    Okay, "water".
Cosmetic improvement to vbccz output: fewer Inform warnings.

Given's vbccz prints all integer constants as 0+5, 0-5 in a
vain attempt to avoid Inform compiler warnings about the
ambiguity of "foo 5 -5" (which is interpreted as "foo 5-5").
I think a better solution is to wrap all literals in
parentheses: (5), (-5).

You might ask whether this raises a new ambiguity between
"foo (bar)" (two arguments) and "foo(bar)" (one argument
containing a function call). However, function calls are
never allowed in assembly contexts, so we're safe.

This change silences 64 of the 162 Inform warnings produced
during the compilation of ODWY0350. The rest are coming from
unused local variables.
Remove unused code.

No change in behavior.
Fix one old bug and a couple of refactoring-related ones.

The old bug is that I carelessly swapped the drop-your-inventory
code with the turn-off-a-carried-lamp code. Knuth got it right
originally.

The other bugs are due to my forgetting to change "0" to "MIN_OBJ"
in a couple of loops.
Copy more wording and spacing from WOOD0350.

Knuth changes *REALLY* (asterisk-delimited in Woods' all-caps
version) to REALLY (using caps for emphasis). Let's use both.

Also, I just noticed that Knuth replaces "my orange smoke" with
"my resurrection kit" in one message, presumably just to avoid
distracting repetition. The repetition is awkward, but not so
much that I think it *needs* to be altered.
Fix the "FEED [dead] BEAR" bug.

KNUT0350 explicitly redirects "FEED BEAR" to "EAT BEAR" when the
bear is dead... but due to a sneaky switch-case fallthrough, the
message that ends up getting printed is default_msg[EAT], not
the normal "EAT BEAR" message. I had misread this when I ported
Knuth's code; hence my confused TODO comment here.

I finally checked this behavior against WOOD0350, and was surprised
to see that Woods' version of this code is perfectly straightforward,
with no sneaky control flow. If the bear is dead, print "Don't be
ridiculous!", full stop. I've fixed the mistake in my code.

(Notice that if the bear is dead, the food must already have been
consumed, and therefore will never be "here".)
Remove a TODO comment.

Knuth's code uselessly sets "k" to 0 or 1 here, which puzzled me;
but I see from WOOD0350 that Woods' code actually used "k" as an
index into a table of messages identical except for the word
"clam" (resp. "oyster"), and I guess Knuth was doing a literal
translation even though "k" is dead in KNUT0350; Knuth uses the
same "clam_oyster" local variable as I do, except that of course
he makes it a preprocessor macro instead of a real variable.

So, nothing needs to change, but I can now remove the comment.
Remove another TODO comment.

Again, Knuth's code is slightly more convoluted than it ought to
be. This time, in fairness, Woods' code is being a little tricky
by unconditionally setting FIXED(BEAR)=2-PROP(BEAR), and Knuth's
code could be taken as a literal translation of that.

I'd like to overhaul the ugly handling of objs(t).base, but I'm
not sure what to replace it with.

    Woods used two arrays PLACE(t) and FIXED(t) to denote
    objs(t).place and what we might call the "place of the
    other half of t". Woods overloads FIXED(t) to indicate
    mobility: t is portable iff FIXED(t) is zero.

    Knuth also uses two arrays place[t] and base[t], but his
    base[t] contains the object index of the other half of t,
    and then you have to look up *its* place[]. Knuth overloads
    base[t] to indicate mobility: t is portable iff base[t]
    is t.

    Platt introduces the explicit notion of "schizoid" objects,
    so instead of having objects TROLL and TROLL+100 (Woods)
    or TROLL and TROLL_ (Knuth), you can have a single object
    TROLL that appears simultaneously in two consecutive
    locations. This isn't a terrible idea --- it's certainly
    an improvement on Woods and Knuth --- but it's still kind
    of awkward to deal with.
Bring into line with master commit ca3e2166.

This fixes a couple of minor bugs (incorrect response to FEED BEAR
when bear is dead, lamp left lighted after death) and one major one
(game crashes on input SAY WATER).