When you turn on the automatic description of a glyph under cursor,
we want to show the short description of what glyph it actually is.
The long full description of all possibilities is far too long, so
may cause more-prompts, and is awkward for blind players.
Replace most uses of isspace() with a simple test for ' ' after
processing the string buffer with mungspaces (which replaces tab
with space, converts instances of consecutive whitespace into a
single space, and removes leading and trailing spaces). The uses
where this wasn't done now cast their argument to (uchar) so that
platforms with signed chars will never pass negative values to it.
I didn't mess with the menu coloring code (except for casts to the
isspace() argument); it almost certainly could benefit from using
mungspaces. I did mess with the symset processing quite a bit,
and hope I haven't accidentally broken anything. Default symbols
and DECgraphics symbols still parse and display ok, so the rest of
dat/symbols should be ok too. I didn't test symbols in the user's
config file because I don't remember how that's supposed to work.
Avoid initializer for auto-class array since many pre-ANSI compilers
didn't support that. Also, when ESC is used to cancel inventory
selection, don't continue on searching for that selection in invent.
Still doesn't address the reported stack corruption.
* 'alt' points to a buffer which has already been processed by
lcase(), so remove the redundant call to that routine;
* common error exit accessed via 'goto' could potentially leave
a dangling window structure (only if 'data' is corrupted though;
it's the only way a failure at that late point could occur).
I didn't find Michael's crasher, but I did find a couple of minor
problems:
knight's saddled pony wasn't found in the file lookup either though
there is an entry for pony ("tame saddled <foo>" stripped off "tame "
but not "saddled "; "saddled <foo>" would only be found of there was
a wildcard entry key of "*<foo>", like "*horse" to catch both horse
and warhorse);
"wombat" matched the bat entry rather than reporting an unknown
entity.
Remove the code that converted statues shown as monsters into stautes
shown as big rocks when saving and then reversed the effect when
restoring. It was done to preserve save file compatability with 3.4.3
where statue-as-monster glyphs didn't exist, so is no longer useful.
* remove several unreachable panic() calls; alloc() already panics
rather than return a null pointer;
* replace a couple of calls to malloc() with alloc() so that
MONITOR_HEAP won't produce spurious alloc/free discrepancies;
* replace several instances of variable 'd' with 'd0' so that it
doesn't conflict with the name of a function;
* comment out opvar_new_region() since it isn't used anywhere.
- honor blindness and hallucination
- honor ability to see one of the mergees
- provide audible feedback if appropriate
- merging inside pack gets special-cased so player knows something
different/unusual is happening
mongone() would send away a vault guard, whether alive or already
dead and parked at <0,0>, losing the information needed to remove
the temporary vault corridor once whatever obstacle (ie, the hero)
that's keeping it in place has been cleared. Have mongone() call
grddead() like mondead() does, so that a guard will just be moved
to <0,0> with 0 HP and kept there rather than being purged during
the next dead monster removal.
Move polearm context reset to m_detach() [and, unfortunately,
duplicated in grddead()] rather than in having it in dmonsfree()
since execution of the latter is deferred. I'm not sure offhand
whether a fast hero could get a second move before end-of-turn
purging of dead monsters.
Give 20 experience points the first time the hero reads a passage
from a tribute novel. It's enough to go from level 1 to 2 or from
2 to 3. By the time a book store is found, that's too trivial for
most to care about, but it's potentially useful to a pacifist.
When minimal_xname() set up a dummy object containing as few details
as possible, it wasn't setting up the fruit id field, so xname()
couldn't figure out what type of fruit it had and issued a warning.
I haven't managed a test case that uses minimal_xname so testing of
the fix is less than comprehensive. [Pasi got it through dopay, but
that only resorts to minimal_xname if the formatted name is really
long and would otherwise cause the shopkeeper's prompt to overflow.
Long fruit name combined with long individual object name wasn't
long enough to trigger that. Maybe uncursed, greased, rustproof
the like, or possibly just a longer shopkeeper name than I had?]
The previous fix prevents the crash from 'the()' when NO_GLYPH was
used as an index into the defsyms array, but it resulted in giving
feedback of "you attack thin air" regardless of what was at the
target location, reverting to the situation that the buggy code was
attempting to address in the first place. Handle that differently
by removing the unseen monster glyph sooner. Also, the underwater
handling wasn't working as intended.
I blamed Derek's pudding farming patch for introducing the problem,
but all that did was replace the offending line(s) with different
indentation. The older post-3.4.3 patch which produced the problem
was mine. Sorry, Derek.
Changes to be committed:
modified: include/extern.h
modified: src/files.c
modified: src/objects.c
modified: src/spell.c
- charge a little more.
- no free read in the bookstore.
Changes to be committed:
modified: src/hack.c
modified: src/pager.c
Don't use glyph_to_cmap as an array index into
the defsyms[] array unless it really is a cmap.
Recent situation: glyph_to_cmap will return
NO_GLYPH for the unknown monster glyph 'I', which
is not a valid index for the defsyms[] array.
A recent fault on mingw32 revealed that faulty
code which passes a bad or out-of-range date
value could have game-fatal consequences.
Add some protection.
...if the map is filled with monsters, and for some reason
the drowning just won't kill you.
Infinite looping cannot currently happen, because no-one who
can drown can keep surviving the drowning once their amulet
of life saving is used up.