A check into github issue 364 confirmed that
ba6edbe5dc
had incorrectly updated the bwrite sizeof entry for sysflags.
The SYSFLAGS and MFLOPPY code is all in the outdated part of the tree, so just
remove it rather than re-correct it.
Closes#364Closes#207
Rephrase a few things and mention the extra boulder(s) since
that feature is a fundamental difference with actual Sokoban.
Fix typo/thinko: "Others rules can...".
Change one instance of /Sokoban/ in italics to ordinary text.
Other conduct descriptions don't use such so it looked odd.
Noticed when checking the sokoban conduct's counter. Breaking
a line of boulders in one zap reported seeing the first but only
hearing the others, despite the first one being gone by the time
the second one was hit and so on down the line for the rest.
Track sokoban cheating (taking actions that incur a luck penalty).
The pull request only reported the number of times (possibly zero)
that the player broke nethack's sokoban rules when reporting the
"you obtained the Sokoban prize" achievement, which is when the
count is most meaningful, but this implements it as a full-fledged
conduct instead. This way the #conduct command can be used after
"creative nethacking" to check immediately whether an action has
violated the Sokoban rules so a player willing to put in a bit of
effort can eventually learn which actions have a negative impact.
The new conduct is only shown during games where the character has
entered the Sokoban branch, but once that has happened it gets shown
no matter the location at the time of #conduct or end of game.
Most of this wasn't in the pull request: expanding the Guidebook to
give more information about sokoban and its conduct.
Bump EDITLEVEL to invalidate to-be-3.7 save files because u.uconduct
has been extended.
Fixes#355
The new sound stuff needed some fixing up.
Guidebook.mn - list start no longer specified the longest key;
in the Postscript/PDF output, the new longer one was partially
overwritten by the text which followed and in the text output,
things didn't line up cleanly anymore.
Guidebook.tex - former last list entry which became next-to-last
was missing a necessary line break. [not tested]
both - sentence punctuation: change period to semi-colon in former
last entry that's now next-to-last; vice versa in new last entry.
fixes#361
Also, experminental introduction of vt_sounddata to enable tty to pass
a sound file index to the terminal side of things where perhaps someone
can add code to something like hterm to take the information relayed by
NetHack to trigger user_sounds locally even if playing on a server.
Compile time option TTY_SOUND_ESCCODES required to build that support in.
It should be independent of TTY_TILE_ESCCODES.
Add the "if these walls could talk" gag. Use an array of message
strings rather than switch/cases of pline calls, and add a couple
more messages.
Also, only give wall feedback if the map indicates a wall (so not
while blind unless the wall is already known) and prevent chat from
pinpointing secret doors (via lack of wall feedback when they're
shown as walls).
After writing the log message for the bell change, I decided to
test the Book and found some issues:
1) reading it while blind discovered the book's type but wasn't
marking the book object as if it had become seen (dknown);
2) reading it while blind gave sighted feedback if it was cursed;
3) reading (blind or not) when either of the other two invocation
tools are cursed referred to those as "artifacts" even though
they aren't artifacts; the discoveries list describes them as
"unique items" but that makes for a clumsy message--use "relics"
instead.
Allow a hero in silver-hating form to ring the Bell of Opening when
on the vibrating square so be able to perform the invocation ritual.
But only at that location and only if the stairs aren't there yet.
This is about on par with being able to read the Book of the Dead
while blind although that isn't limited to a specific location.
The report about problems after stone-to-flesh on a petrified
long worm included stethoscope feedback of 0(-1) hit points, after
life-draining. I was unable to reproduce a maximum hp of -1 and hope
that it was a side-effect of the [already fixed] stale mon->wormno
value used when resurrecting the long worm. Anyway, this changes
life-draining to never take mon->hpmax below mon->m_lev + 1 (the +1
is needed to cope with m_lev==0 monsters). The same limit is also
applied to monster life-saving but more to avoid replicating the
arbitrary minimum of 10 (four instances) then because it might be
less than m_lev+1 somehow.
Sanity checking now tests whether a monster's max HP is less than
its level + 1 so if there are ways other than life-drain attacks for
it to drop that low, the fuzzer will choke. The new check also tests
whether a monster's current HP is greater than max HP.
Polymophred hero killing a golem or vortex by vampire bite reported
"<Mon> dies." Give an alternate message since those aren't alive.
Eliminate most of the minor differences between dat/history and the
end section of doc/Guidebook.txt which didn't seem to be intentional.
Several commas, a couple of past/present tense discrepancies, and
various clauses or whole sentences which were in one but not the
other. There are still differences which this doesn't address.
Also a couple of actual changes. Make the Guidebook refer to itself
as "this document" rather than "this paper". Change "dozens of
people's work" to "scores of people's work". Add a new sentence
describing the version numbering scheme used by 3.0, which wasn't
3.0.x yet.
Adopt the contribution to use "you can't read the words" when
trying to read a novel when blind rather than defaulting to
spellbooks' "you can't read the mystic runes." An unseen novel
is already described as "a book" instead of "a spellbook" so the
alternate feedback doesn't give away any information.
Warwick did the heavy lifting of the first tiles implementation. But
I was the one who suggested changing his terminology to "tiles" even
though that doesn't match the term's traditional usage in computer
graphics. Since then, our [mis-]usage has spread beyond nethack and
its variants. [This isn't just bragging; I recall several years ago
that someone thought our implementation of tiles for MS-DOS was the
original implementation. Their search of the newsgroup archives didn't
find Warwick's original announcement--Atari binaries and/or a source
patch in between releases--because the term "tiles" wasn't in use yet.]
I'm not sure whether Dean's font preceded Warwick's icons, but the
concept did. If the description of their implemenations is backwards
than that bit should be reworded.
Also, add a sentence explaining why NetHack++ "was quickly renamed
NetHack--".
Guidebook.mn had a mixture of literal "--" and \(em to insert an
M-sized dash. The literal was poor usage but the 'em' directives
were using " \(em " for source readability. Unfortunately those
spaces ended up being included in the output where a long dash
shouldn't be surrounded by such. This changes both to be
|start\(emmiddle\(emend
for proper usage without unwanted spaces. The 'roff source becomes
harder to read so such phrases have been moved onto separate lines
instead of just staying within the flow of words. (I tried
|start
|\(em
|middle
|\(em
|end
but the newlines became unwanted spaces in the output.)
Guidebook.tex incorrectly had a numeric range dash ("--") instead
of long dash punctuation ("---") in the places where the 'roff
version had literal "--". I also moved the quite readable
|start---middle---end
phrases and a handful of whole sentences to separate lines to match
the Guidebook.mn source more closely.
One trivial text change is "you will forget" to "you will have
forgotten" in the bit about what happens to remembered objects
when the "remembered, unseen monster" glyph is taken off the map
since forgetting happens when that glyph is put on.
"if will" should be "it will". The pull request only fixes this
for Guidebook.tex but it is also present in Guidebook.mn. The typo
made it from one to the other via copy+paste.
Fixes#358
Option parsing for booleans tried to accept "optname:true" or
"optname:yes" or "optname:false" or "optname:no" but it didn't work
because boolean options with a value were rejected before getting
to that. Make parsing for booleans get far enough to handle those
values, treat them as case-insensitive, and add "on" and "off" as
additional choices. "true" and "false" can be truncated to 3
letters, the other values need to be fully spelled out but are all
only 2 or 3 letters long.
montraits() didn't have any handling for long worm tails, makemon()
didn't have any provision for creating a long worm without a tail,
replmon() uses place_wegs() to put tail segments on the map when
replacing a dummy new monster with the mtraits one but place_wsegs()
wasn't updating the head segment since it isn't put on the map.
That turned out to be key because there is always an extra segment
co-located with the monster and when its coordinates were wrong,
worm_known() gave bad results for visibility checking. The
statue-goes-away message was the one for not being able to see the
monster that it just animated into, even though 'w' appeared at the
spot. It took quite a while to track down what was going on there.
Sanity checking for worms has been updated and could conceivably
start triggering complaints about things that it used ignore.
A thieving monster could be killed while the hero was busy taking
off armor which needs multiple turns (normally a suit) and if that
happened on the same turn as the take-off finished, the warning
"stealarm(): dead monster stealing" was issued. Cited case was
having the thief be killed by a stinking cloud but it could happen
if the death was caused by a pet or by some other monster trying
to attack the hero. If the thief died sooner, the situation was
silently ignored. So this could have been fixed by just getting
rid of the impossible() feedback.
'stealmid' and 'stealoid' should have been static in steal.c rather
than global and as such should have been moved into 'struct g'.
This moves them there and then takes advantage of having access to
'stealmid' outside of steal.c. That's just a minor optimization
since m_detach() could call new thiefdead() unconditionally and the
latter could check whether the dead monster matches 'stealmid'.
Fixes#354
If a monster uses the 'summon insects' spell (which will resort to
snakes if all 'a' class critters are genocided or extinct) while the
hero is hallucinating, report the summoning of something unusual
rather than of insects or snakes. I bypassed "random creature"
direct to "hallucinatory creature" for the something unusual.
Fixes#351
If a monster uses the 'summon insects' spell (which will resort to
snakes if all 'a' class critters are genocided or extinct) while the
hero is hallucinating, report the summoning of something unusual
rather than of insects or snakes. I bypassed "random creature"
direct to "hallucinatory creature" for the something unusual.
Fixes#351