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
The recent change to mkclass() was letting genocided monsters be
created when role-specific monsters were chosen for quest levels.
makemon(Null) -> rndmonst() -> qt_montype() -> mkclass() -> mk_gen_ok()
was accepting members of the quest-specified class even when they
should have been rejected. I'm still not sure why the revised bit
manipulation didn't work as intended; the re-revised code does.
G_IGNORE was a bug waiting to happen since it gets passed to
mkclass() as a mons[].geno flag but is used to control the use of
mvitals[].mvflags values. It's still being misused but at least
it doesn't conflict with any of the other flags now.
Fixes#352
Rot and revive timers are turned off when a corpse gets put inside
an ice box. They get turned back on when taken out of the ice box
by the hero but were being left off if taken out by a monster.
That resulted in corpses of arbitrary type behaving like lizard
corpses and never rotting away.
This fixes that. It also changes troll corpse behavior. Once put
in an ice box, a troll corpse will not get a new revive timer when
taken out, just an ordinary rot timer.
Reported directly to devteam; transcription typo: had "Vines", should
be "Vimes".
I double checked that long passage and found two other mistakes:
"proffered" was misspelled with 2nd 'r' doubled,
| 'Quoted statement,' someone said. 'Another statement.'
lacked the opening quote on the second sentence.
My source uses double quotes (normal American usage). I'm not sure
why the passages which refer to it--the page number annotations
specify that same source--were transcribed with single quotes (normal
British usage), but I've left those as is.
The sentence with "Vines" was also separated from the previous one by
a single space when nearly everything in dat/tribute uses double space.
A quick regexp search found half a dozen or so other instances of that.
This fixes those but the searching wasn't rigorous and it's sometimes
ambiguous whether an elipsis or long dash constitutes the end of a
sentence before another starts or is just in the middle of a long one.
Accept or ignore the in-hell-only and non-in-hell-only flags on
a monster type by monster type basis instead of all or nothing
for a given mkclass() call. Prevents demon summoning outside of
Gehennom from bringing in only succubi and incubi 10 times out
of 11 and mixture of demons the other time.
Change mkclass() to always honor the hell-only monster generation
flag for L class, preventing master and arch-liches outside Gehennom.
For other classes, honor hell-only and outside-hell-only most (89%)
of the time. When not honored (11%), it allows demons and devils to
appear outside of Gehennom as they have in the past. [That part
might need to be re-done since it is done for all monsters in the
class on any mkclass() call instead of being done on a class-member
by class-member basis within each such call.]
This prevents out of depth liches in the Castle and ought to do same
for themed rooms of type 'Mausoleum' although I haven't figured out
how to test that.
Fixes#349
Displacer beast and genetic engineer lacked data.base entries so
I've made a couple up from thin air. I tried to look up "genetic
engineering" in _the_Concise_Dictionary_of_Biology_ (after seeing
that the quantum mechanic quote comes from _Concise_Dictionary_of_
_Physics_) but could only view the first sentence so don't know
whether it had anything more useful. I also skipped the AD&D
Monster Manual for displacer beast except for remembering the
puma-like bit from previously checking it. So regardless of any
old copyright issues in data.base, there shouldn't be any new ones.
is nonsense, grammatically speaking. Change the variant wording of
"you resume your meal" to be "you consume the last bite of your meal".
The alternate wording is intended to handle the case where no "you're
finally finished" message occurs (#H8922) but I don't remember how to
reproduce that so got both "you consume last bite" and "you finish".
When everything is identified and you read a scroll of identify, you
get
|You have already identified all of your possessions.
That's unchanged. Same situation, except learning scroll of identify
at the time and you've just been told "this is a scroll of identify":
old |You have already identified all the rest of your possessions.
new |You have already identified the rest of your possessions.
Fix a complaint from 'heaputil' about freeing a Null pointer. ANSI C
allows that but but older implementations could have problems.
This code is from four months ago and I don't remember how thoroughly
it was tested at that time. It's only had minimal testing now.
If regex_compile() fails, free the regexp before doing anything else
in case failure reason is "out of memory". Feedback to the user is
highly likely to panic or crash after memory runs out; this should
let the regex failure message be issued and the game continue.
User sound regular expressions were never freed. This frees them
when FREE_ALL_MEMORY is enabled.
Avoid the warning that tmpname should be replaced by mkstemp by
replacing tmpname with mkstemp. lua has code to do that but it isn't
trivial to activate while leaving the lua distribution unmodified.
[I've no idea whether nethack's usage even results in liblua ever
creating any temporary files.]
Using nethack's hints to pass -DLUA_USE_POSIX from top Makefile to
lib/lua-$(LUA_VERSION)/Makefile has been tested, building liblua.a
on linux with that has not.
Post-3.6.x issue. head_engr has been defined in engrave.c for ages
but the definition was relatively recently duplicated in decl.c.
gcc 10 defaults to more rigorous checking (-fno-common) and complained
about the duplicate. Remove the original definition from engrave.c.
Fixes#346