Files
nethack/doc/fixes37.0
PatR d736cbd751 fix github issue #603 - guarding prize items
Reported by Vivit-R with comments by several others.  The prize item
in one of the closets off the Sokoban treasure zoo is sometimes
missing, most likely picked up by an elf who won't be dissuaded by
the presence of engraved Elbereth or a scroll of scare monster.

This fix prevents monsters from targetting the mines' and sokoban's
prizes for pickup (or for eating).  Once the hero picks either of the
prizes up, they stop being prizes and will be ordinary monster fodder
if dropped/stolen/stashed.

One of the comments by copperwater suggested this approach as a
possible way to fix things.  I had already implemented it from scratch
before noticing that.  It handles the usual monster behavior toward
items, but there could easily be some unusual cases still susceptible
to taking the prize before the hero gets to it.  Those are the breaks.

Fixes #603
2021-10-28 01:05:18 -07:00

1456 lines
90 KiB
Plaintext

NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.630 $ $NHDT-Date: 1629928191 2021/08/25 21:49:51 $
General Fixes and Modified Features
-----------------------------------
hero polymorphed into a vampire can use #monster to shape-shift rather than
just do a one-shot polymorph into bat/cloud/wolf and shifted vampire
hero can use #monster again to take on another form (randomly chosen
among the shiftable shapes and true vampire form)
adjust bones filename buffer sizes to accommodate suffix
fix internal self-recover to work with recent fields added to checkpoint file
improvements to pronoun usage when hallucinating
function calls made from map_glyphinfo() based on dungeon level are now called
once per level
fast hero could have random clairvoyance happen more than once on same turn
using 'Q' on wielded weapon would offer to split stack; make using 'w' on a
quivered stack behave similarly
weight for giant spider was too low for creature of size 'large';
weight for giant beetle was much too low for 'large'
leave some menu items out of "invert all" via '@' when their inclusion would
degrade the usefulness of that interface feature
change crysknife from mineral to bone and worm tooth from unspecified to bone
worn meat ring shouldn't cause increased hunger; neither should fake Amulet
worn +0 ring of protection should cause increased hunger if it is the only
source of extrinsic Protection
monster wielding Stormbringer or healer's Staff against another monster would
heal the hero instead of the wielding monster when draining life
change twoweapon feedback from "not a weapon" to "not a suitable weapon"
don't allow twoweapon combat if either weapon is a bow, crossbow, or sling
[later: or arrows, bolts, and missiles (darts, shuriken, boomerangs)]
drum of earthquake feedback reported various things (fountains, thrones, &c)
falling into a chasm but they remained intact because trap creation
had been changed to not clobber such things (so couldn't make pits)
make earthquake which hits a secret door or a secret corridor reveal it
wizard mode wishing for "Amulet of Yendor" had 50:50 chance for true Amulet
or a cheap plastic imitation; recognize "real Amulet of Yendor" and
"fake Amulet of Yendor" to precisely specify either of them but also
take away the 50% chance of yielding a fake one when neither real nor
fake is specified
unpaid globs showed weight info unconditionally outside of wizmode
walking out of tethered-to-buried-object trap condition was supposed to
reinstate punishment but wasn't finding the buried iron ball because
the trap condition was cleared first to indicate escape; result was
attached chain that got dragged around but had no ball attached
when poly'd into a giant and moving onto a boulder's spot, message given was
confused about whether autopickup would occur so could be misleading
random role selection wasn't honoring unwanted alignment(s) properly
if at the edge of the map window, trying to move farther fails but used a turn
hero can no longer wear blindfold/towel/lenses when poly'd into headless form
revamp achievement tracking for exploring Mine's End and Sokoban (by acquiring
luckstone and bag of holding or amulet of reflection, respectively)
throttle long worm growth rate and HP accumulation
poly'd hero was able to zap wands, apply tools, and #rub objects without
having any hands
spellcasting monster got an extra move after casting
allow defining #wizgenesis quantity in the prompt
digging through iron bars from an adjacent pit made a pit on top of the bars
give feedback if controlled level teleport attempt fails because hero is
already on the bottom level and player tries to go even deeper
unseen pet that drowned didn't give "you have a sad feeling" message
prevent ravens from blinding other ravens: /corvus oculum corvi non eruit/
have ^X provide more information when held or swallowed
display wasn't updating immediately after toggling hilite_pet option
randomly choosing role could lead to crash via segfault
if eel bite attack caused hero to move (killed + rehumanized + crawled out
of water), its grab attack could succeed even if no longer adjacent
specifying a count when picking [part of] a stack of scrolls of scare monster
ignored that count and the whole stack was affected
wizmakemap didn't account for unique monsters and didn't correct monster
birth counts
generate objects (eg. statues) with genocided or extinct monster classes
in special levels, if requested
if the orc-town version of mine town has been loaded, creation of orc zombies
or orc mummies would name them as part of the town raiding orc clan
when punished, involuntarily teleporting and landing within chain range of
attached ball while encumbered worse than burdened could trigger
"remove_object: obj not on floor" panic on hero's next move
update persistent inventory when 'menu_headings' or 'sortloot' options change
update persistent inventory when putting on a helmet causes it to auto-curse
inventory cursing caused by "this water's no good" effect when drinking from
a fountain didn't update persistent inventory window
leashing or unleashing pets wasn't updating persistent inventory window
when the wetness of a towel in inventory changed, persistent inventory wasn't
updated to show that
using wizard mode identify to ID 'all' updated perm_invent window but IDing
specific items--even every one of them--did not
hold_another_object added item to inventory first, then maybe removed and
dropped it, resulting in spurious add and remove perm_invent updates
when hold_another_object fails while hero is swallowed, drop the item into
swallower's inventory instead of onto the floor
hold_another_object (for wishing, horn of plenty, theft while poly'd, other
non-pickup actions giving hero another inventory item) wasn't
reporting change in encumbrance; that would catch up on next turn but
could be off during additional move(s) for current turn
hold_another_object used hardcoded Stressed to limit carrying instead of
using the 'pickup_burden' option for that
transforming a potion by dipping a unicorn horn into it could result in the
potion being dropped due to 'pickup_burden' if encumbrance was already
over threshold before dipping but within it after removal from invent
fix priest created inside temple wall
fix vault guard occasionally encasing monsters in stone
tone down scare monster by excluding humans and uniques
lock the castle chest
revamp amnesia to forget skills instead of objects or maps
when Punished and carrying the iron ball and levitating, hurtling in the
opposite direction of a thrown object didn't bring along the chain
recognize "kirin" as alias for "ki-rin" when asked to create a monster
make unique swallowing monsters (Juiblex) resist magical digging from inside
correctly account for fuel remaining when lit candles are attached
to candelabrum (the previous code would make the game unwinnable if
there were 15 or fewer turns remaining)
praying on an unaligned altar outside of Gehennom behaved like an ordinary
prayer; make that always fail
tribute (Discworld snippets) typos, in book order rather than fix order:
Sourcery passage #4 "the moment the words were out of your mouth" ->
"the moment and the words out of your mouth" where "were" didn't
belong and awkward phrasing because of it caused "and" to be removed
(would be much clearer if optional comma after "moment" was included)
Moving Pictures passage #10 initial single quote should be double,
#12 "or" -> "of", #14 second instance of "megalomaniac" misspelled
Lords and Ladies passage #5, near end add missing opening double
quote, passage #7 last paragraph, "to" -> "be"
Men at Arms passage #1, italicize /for/, passage #2, insert omitted
word "had": 'it was /fate/ that _had_ let Edward'
Interesting Times passage #1, italicize several words
Feet of Clay passage #1, second "does not need" -> "doesn't even need"
Hogfather passage #7 missing initial double quote for "Oh, just ...",
also #7 insert missing "you" into "Why are you feeling [...]"
Soul Music passage #1, italicize /feel/, #8, "fossile" -> "fossil"
Jingo passage #2 "Vines" -> "Vimes", "profferred" -> "proffered",
missing opening single quote on second sentence of Lord Downey's
line, passage #11 both in footnote: "genious" -> "genius",
"was, oddly enough, was one [...]" -> "was, oddly enough, one [...]"
The Fifth Elephant #1, italicize /always/, #9, "dublet" -> "doublet"
The Truth #1, italicize several words
Thief of Time #2, "gold starts" -> "gold stars"
A Hat Full of Sky passage #9 "though" -> "thought"
various, including Death quotes: use two spaces to separate sentences
unicorn corpses and wraith corpses could be sacrificed even if "too old"
hero polymorphed into a hider and hiding was not unhidden when teleporting
impose tighter restraints on 'summon nasties', both for spellcasting monsters
and post-Wizard harassment
prevent swallowing monster ending up in a solid wall if it killed vault guard
fix attached ball getting deallocated if swallowed, going down into a pit,
and saving
level compiler creates correct novel with supplied name
for farlook, describe water in the castle moat and in Juiblex's swamp as moat
and as swamp, respectively, rather than just as "water"
make hezrous emit poison clouds when they move
stepping from one type of terrain to another was triggering an unnecessary
status update
make shriekers summon baby purple worms if purple worms would be too tough
make non-tame (baby) purple worms eat corpses off the ground
make baby purple worms attack shriekers
make hero polymorphed into baby purple worm warned against shriekers
confused scroll of light summons tame cancelled lights
potions of hallucination can give enlightenment
add a small chance of surviving food poisoning
deliberate level teleporter activation ignores magic resistance
auto-id scroll of remove curse when a known buc-state was changed
demon lords hate Demonbane
pets avoid eating shapeshifter corpses unless starving or nearly feral
blessed scroll of teleportation gives a single controlled teleport
allow opening a tin without interruption if slimed
tell player when wielding a different weapon toggles off dual-wielding
object taking erosion damage might give feedback message when out of view
or not give such when in view, depending on stale value of 'bhitpos'
[cited case assumed message came from drowned monster's dropped
inventory when out-of-view ice melted]
it's possible to wish for tins of the Riders in wizard mode; eating one is
fatal but if you're life-saved or decline to die, the game crashed
revival via undead turning of corpse carried by hero said "your <mon> corpse
comes alive" even when revived monster was undead
prevent searching or waiting next to a hostile monster if boolean option
safe_wait is on - override with 'm'
allow random mimics to show up mimicing more furniture than just stairs
scatter exploding bag of holding contents instead of outright deleting them
male hero poly'd into nymph chooses charm vs seduce message based on being
male rather than on all nymphs being female but charm message was
using hardcoded pronouns She,her for target monster--wrong for male
target and noticable if "<mon> finishes taking off his suit" is given
hostile monsters with a ranged attack try to stay away from melee range
allow displacing peaceful creatures
unicorn horns don't restore attribute loss anymore
when a shop is changed from food to health food, change room type to match
wish parsing of things containing monster names would accept all supported
alternate spellings if they occurred at the end ("corpse of mumakil")
but only some when they occurred elsewhere ("gray-elf corpse" worked,
"mumakil corpse" yielded "does not exist") depending upon name length
couldn't wish for werecreature corpse or tin because monster name lookup
always matched the beast form which is flagged no-corpse; switch to
human form for "were<creature>"
wishing for werecreature figurine always made one that created the monster in
beast form if activated; allow "human were<creature>" to explicitly
specify werecreature's human form (for corpses and tins as well as
figurines); override the restriction against human figurines for that
wishing for "royal jelly" yielded "lump of royal jelly" as a special case, but
other 'of' items such as "clove of garlic", "sprig of wolfsbane", or
"piece of cloth" didn't allow using their post-of words as shorthand
monster or object detection found semi-dead vault guard at <0,0> while
traversing fmon list; monster detection gave misleading feedback
(blank map instead of 'strange feeling') if there were no other
monsters on level; likewise object detection and guard's minvent
squadprob[] in mkroom.c was defined with 5 elements but initialized only 4
resulting in giant ants sometimes
allow nurses heal attack when wielding a non-weapon/weaptool
if riding or levitating, hero could apply bullwhip downward to pull up things
from underwater or lava; feedback implied the item was on the surface
some monster code was checking whether pets or engulfers were eating green
slime by checking for green slime corpse instead of glob
change light radius of stack of candles to square root
could get redundate "mon hits other-mon" messages when mon wields an artifact
failed untrap while mounted that moved hero onto the trap would leave steed
with stale coordinates, triggering warnings if 'sanity_check' is On
when digging a pit results in it being filled by adjacent pool or lava, any
objects at the spot weren't subjected to water or fire damage;
also, riding hero's steed wasn't subjected to immersion either
after "double trouble", cloned Wizard would wait until he had suffered some
damage or hero moved into direct view; keep STRAT_WAIT for original
Wizard but avoid that for clones
beyond turn 100000, prayer timeout is longer (scaling with game length)
falling while going down stairs and dropping items due to encumbrance or
punishment wasn't subjecting fragile ones to breakage
objects scattered by an explosion which land on water or lava weren't affected
by the water or lava
change mkclass() to usually honor (always honor for L class) the hell-only and
never-in-hell monster creation flags; no more achi-lich in the Castle
(nor master lich there unless demilich gets a potion of gain level)
thieving monster could be killed while hero was removing armor, triggering
warning "stealarm(): dead monster stealing" when taking-off finished
petrifying a long worm and then reanimating it handled tail incorrectly;
with sanity_check On, X coordinate of head segment was reported as 0
attempting to read a novel while blind reported "you can't read the mystic
runes" like for a spellbook; use "you can't read the words" for novel
don't let life draining reduce a monster's max HP below its level + 1
report "<Mon> expires" rather than "<Mon> dies" if polymorphed hero kills a
non-living monster (golem, vortex) with life drain (vampire bite)
allow hero in silver-hating form to ring the silver bell but only if on/over
the vibrating square
reading the Book of the Dead while blind is allowed; doing so gives
"you turn the pages of the Book of the Dead" and the type of item
becomes discovered, but the object wasn't being flagged as 'dknown'
so if not seen yet it remained "a spellbook" in hero's inventory
reading cursed Book of the Dead while blind gave feedback for sighted hero
reading non-cursed Book of the Dead after prepping with the other tools gave
a message referring to those as "artifacts" if either of them were
cursed; those unique items aren't artifacts so use "relics" instead
zapping a line of boulders with striking or force bolt was updating 'couldsee'
but deferring 'cansee', resulting in seeing the first boulder fracture
and only hearing that happen for the others despite coming into view
the default engraving, epitaph, and bogus monster inserted by 'makedefs -s'
(3.6.6 fix for empty source data file) lacked terminating newline, so
when the corresponding file wasn't actually empty its first line ended
up concatenated; default portion of the bad combined entry would be
decrypted properly but the portion from the file's first line wouldn't
if the Wizard of Yendor fled up the stairs on level 1, the game would behave
as if he was still in play, but he wouldn't be on migrating monsters
list so couldn't be brought back and wouldn't appear on Plane of Earth
(stale non-zero value for context.no_of_wizards)
if a mind flayer's psychic blast targetted a hidden monster, feedback named
the monster but it wasn't brought out of hiding
hero poly'd into a mind flayer who used #monster to emit a psychic blast was
able to harm mindless monsters with it
some hero attacks that should have gotten a skill bonus or penalty didn't
change internal name of "<foo> venom" to "splash of <foo> venom"
some operations that made sense to handle venom ('D', scroll of identify, no
doubt others) ignored it because venom is suppressed from packorder;
matters for wizard mode or for normal play that loads wizard bones
singularize "splashes" to "splash" instead of "splashe"
treat slinging gems and tossing or slinging stones at unicorns as attacks
give rot-away timer instead of revive timer to corpses of cancelled trolls
switch revive timer to rot-away timer if a troll corpse gets cancelled
uncancel an ice troll if its corpse is put into an ice box; give corpse a
revive timer if later taken out
splitting a stack of candy bars gave new wrapper text depending upon the
obj->o_id value assigned; keep existing text for both halves of stack
(side-effect: separate candy bars usually won't merge anymore)
describing tin variety (deep fried, pureed, &c) relied on the 'contents known'
flag but object identification wasn't setting obj->cknown for tins
wizard mode #wizintrinsic: setting Levitation wouldn't block Flying as
intended because the check for that was being made too soon
chatting to the quest leader in wizard mode with sufficient experience level
and insufficient piety, player is asked whether alignment should be
boosted; answering 'n' resulted in being prompted a second time
end of game inventory disclosure passed an inappropriate argument to the
inventory display routine; not noticeable for tty and curses,
noticeable but not harmful for X11, and slightly harmful for Qt
turning into slime rendered hero as slime one turn too soon
avoid potential infinite loop if hangup occurs at ring "right or left?" prompt
randomize the turns where accessories and extrinsics affect nutrition
handle being interrupted by approaching monsters more consistently
if hero attacked a peaceful monster, some other peaceful monsters with humanoid
shape (minotaur, zruty, perhaps others) that witnessed it but which
shouldn't be capable of normal speech expressed their surprise audibly
make gasp/exclamation message from peaceful monsters be more verbose to
indicate which monster is doing the gasping or exclaiming
when make was invoked with -j makedefs instances could end up running in
parallel and could trample on each other's temp files; default to
using mkstemp(); allow a port runtime library implementation that lacks
mkstemp() to define HAS_NO_MKSTEMP to revert to the old behaviour;
provide a work-alike mkstemp() implementation for windows visual studio
in mdlib.c so there is no requirement to define HAS_NO_MKSTEMP there
make piranhas faster and give them extra bite attack
fire sources can ignite candles, lamps, and potions of oil
for multiple drop ('D') with menustyle traditional or combination, if the only
object class player picked was '$' then it operated on all classes
small monsters could seep through their shirt
don't snuff brass lantern when it's hit by water unless it is submerged
when reporting that hero can't repair a chest's broken lock with key/pick/card
just describe the base item without BUC, user assigned name, &c since
"You can't repair a chest's lock with an uncursed key." implicitly
suggests that you might be able to do so with a blessed or cursed one
pre-populate teleport destination prompt with travel destination
ghosts cannot be renamed
tossed upwards objects got two times half physical damage reduction
monster xorns could pass through iron bars but not eat them; monster rock
moles could no neither; now they can eat bars when adjacent and will
do so if the bars are blocking their path
hero poly'd into rust monster could implicitly eat bars when adjacent by
trying to move there, now when in rock mole form too; in xorn form
can explicitly eat them via 'e' after moving onto their spot
monster hiding under an egg that hatched was kept hidden
restful sleep regenerates hit points
attacking non-adjacent concealed mimic by applying a polearm would make the
hero be stuck to that mimic
hero could break a wand ("raising the wand high over your head, you break it
in two") even if hands were welded to a two-handed weapon or to a
one-handed weapon and also to a shield
if a monster threw a cocktrice egg at the hero but hit and petrified another
monster, the hero would get credit/blame for killing it
since ki-rin look quite a bit like unicorns, make them be more like one:
allow them to use their own horn to cure themselves; remove M1_ANIMAL,
change MS_NEIGH to MS_SPELL, add MR_POISON, use horse body parts;
they're still 'A' rather than 'u' and don't care about gems
wand/scroll of create monster or bag of tricks that makes a new monster which
can be seen or sensed becomes discovered, but was doing so even for a
concealed mimic seen as furniture or an object
'showscore' could be used to determine how much gold was inside a container
whose contents were unknown
wizard mode (only way to get timed flying): if levitation and flying time out
on same turn, player was told "You have stopped levitating and are
now flying."; status line wasn't updated to remove stale Fly condition
throwing or kicking a shop container (that's light enough to move) made the
hero pay for any gold inside, then didn't refund that amount if the
container landed inside the shop
try to fix message sequencing for tame golems that "roast/rot/rust in peace"
autodescribe when moving the cursor was erroneously honoring MSGTYPE=stop
and potentially delivering sounds
reduce the number of "seeXYZ" commands by renaming some: #seenv -> #wizseenv,
#seegold -> #showgold, #seespells -> #showspells, #seetrap -> #showtrap
when saving while punished or game ends while punished, handling for ball and
chain might access freed memory with unpredictable consequences
brown pudding monster hitting another monster with decay attack corroded armor
instead of rotting it
<?> -> <full key bindings> omitted 'n' prefix and M-digit for number_pad mode,
and ^A/re-do was suppressed due lack of obsolete '#define REDO'
add missing key binding support for rush.numpad; default is M-5 for numpad==1
or plain 5 for numpad==2 where behavior of 5 and M-5 are swapped
allow monsters to use wand of undead turning to revive corpses on floor
in some situations
selling a container to a shop for gold leaves any contents that the shop
doesn't ordinarily buy and sell owned by the hero, but selling the
container for credit resulted in the shop taking poesession of such
contents without giving any additional credit; mark out of place
contents 'no_charge' so that hero can reclaim them without buying
add some new demonic and angelic maledictions
when fire damage dried a wet towel, it would never reduce the wetness to 0
when water damage wet a towel, the new wetness might randomly become less
make Death revive earlier, and all the Riders after 67 turns at latest
when protection from shape changers begins, force mimic out of concealment
even if hero can't see its location; for locations that can be seen,
don't make double-trouble Wizard concealed as another monster--or pet
temporarily mimicking something while eating mimic corpse--fall asleep
best possible armor class reduced from -127 to -99; worst from +127 to +99;
charged or enchanted individual items also capped at +/- 99 (affects
wizard mode wishing, negligible effect on normal play)
fix several inconsistencies for objects at hole locations
make repeat (^A) work when bound to some other keystroke
if a prefix key was bound to some character which ordinarily ran a regular
command and that command wasn't bound to another key, typing the
prefix followed by a non-movement key behaved strangely: instead
of reporting "invalid direction" it would run the other command
(actually depended upon relative order of prefix's new and old key)
reqmenu (the request-a-menu prefix supported by a handful of non-movement
commands) could be bound to some key other than 'm' but it only
worked if the new key was also a movement prefix
when telepathically sensed pet ate a mimic corpse and temporarily took on
a different shape, you were told that you sensed it changing into
something but the map continued to show its true shape (telepathy
overrides mimic hiding); give a different message in that case
when a pet ate a mimic corpse and tried to temporarily look like a sink it
ended up looking like a throne (terrain type SINK == symbol S_throne)
have dowhatdoes ('&') catch up with '?i' to describe ^A, ESC, and movement
prefix keystrokes correctly instead of reporting "no such command"
give barrow wights a cold touch
for configuration using external compression on save files that applied a name
suffix, 'selectsaved' (restore via menu) couldn't handle any which had
been manually uncompressed, mangling file name trying to remove suffix
an empty lamp hit by fire reported "the oil lamp catches fire" (but at least
didn't light)
spells that require a target spot rather than a direction (like skilled
fireball) would not let a blinded hero target his/her own spot, with
feedback stating hero failed to hold location sufficiently in mind;
when not blind, such spells left autodescribe feedback for target spot
in the message window while the spell was being performed
prevent wish request "death wand" from matching Death monster and producing a
random wand instead of a wand of death
grammar bit: "you hear a [AEF] note squeak in the distance" (should be "an")
curses interface failed to honor menu_xxx option settings for menu interaction
during engraving, spaces were counted instead of non-spaces [later: affected
code is gone, removed when engraving was converted into an occupation]
when an explosion scatters objects, make any that fly over sinks stop there
output message when changing fastmove mode while cursor targetting
messages when Minetown watchmen become angry could report "you see an angry
guard approaching" even if he was invisible and hero can't see invis
when autopickup is on but disabled due to being inside a shop, have ^X say so
don't force fake player monks to always be male
it was theoretically possible to overflow an internal buffer containing
inventory letters by carrying more than 52 separate lit candles and
using the '(' or '*' commands
hero would be blinded and stunned by an Archon's radiance (gaze attack) even
if the Archon was blind, but monsters would not
applying a polearm to attempt to attack a hidden monster would report "wait!
there's a monster hidden there" and display the "remembered, unseen
monster" glyph but only use a turn if polearm wasn't already wielded
key parsing during options processing was inconsistent between OPTIONS=foo:k
BINDINGS=k:foo where k represents a key designation; the OPTIONS form
recognized backslash escape sequences but not M-x meta characters,
vice versa for BINDINGS (most noticeable for menu interaction keys
such as menu_next_page because those can be set via either directive)
when creating a rolling boulder trap, don't place boulder on a path that
starts on or passes over a pit/spiked pit, hole/trap door,
teleport trap/level teleporter/magic portal
remove superfluous "All" from "All foos are already nonexistent." when blessed
genocide tries to remove something which has already been genocided
"#dip <item> into -" produced a scrambled message:
You mime dip <item> intoing something.
similarly, "#rub the royal jelly on -" produced
You mime rub the royal jellying on something.
mounted hero falling out of saddle shouldn't hit ground and take damage when
levitating or flying (if done without steed's help)
avoid "obj not free" panic if monster kills itself by reading scroll of earth
attempting to throw a partial stack of gold at self was prevented but left
the partial stack in an extra $ inventory slot
quivering a partial stack of gold succeeded and put the partial stack in an
extra $ inventory slot
if player managed to get multiple $ items, all but the last could be moved to
normal letter slots via #adjust and then subsequent #adjust with a
count could split them into even more slots
when a monster on the far side of a closed door opens it, sometimes the hero
was told about the monster without it being displayed on the map
also show extended command name when showing what a key does in help
poly'd hero who exploded when attacking a monster didn't wake up other
monsters in the vicinity; when attacking thin air, hero's explosion
woke other monsters within different radius than same monster's would
troll corpse revival was inhibited by hero wielding Trollsbane; change that
to being killed by Trollsbane instead (wielded by hero or by monster)
statues representing petrified creatures on Medusa's level might be from
monsters who change form (golems) when hit with stoning damage
attempt to make corpse or statue of a named player character would yield that
of a random monster instead when 'record' was empty; could result in
statues of non-stonable creatures in cockatrice nests
homemade tin of very low nutrition corpse gave more nutrition than the corpse
magic mapping performed while engulfed or underwater would display whole map
but then not switch back to the engulfed or underwater restricted view
#overview used hardcoded bold and inverse for highlighting; switch to the
'menu_headings' option value so player has some control
for menustyle:full, the 'A' menu choice to auto-select everything now only
does so if no other choices have been picked; when any have (object
class or BUCX state or both), it auto-selects every item that matches
those choices (so still skips the second menu) rather than every item
using travel to move one step diagonally where that step was blocked by being
too narrow to squeeze through stopped travel instead of considering
alternate routes to the destination
turn off input autocompletion for '#twoweapon' since simple 'X' invokes it;
likewise for #wizdetect (^E), #wizgenesis (^G), #wizidentify (^I),
#wizlevelport (^V), #wizmap (^F), and #wizwish (^W); probably ought
to do so for #overview (^O) too but that one still autocompletes
if a branch has only one level (Fort Ludios), prevent creation of any level
teleporters there (level definition doesn't have any but wizard mode
wishing could attempt to place one)
opening/unlocking magic zapped at monster holding the hero will release hold
(zap at engulfer already expels hero); zapping at self has same effect
when riding, allow scroll of remove curse read by hero to affect steed's saddle
the 'scores' option for final top ten display left default values in place if
only some of the three settings were set; 'scores:own' should have
produced '0 top/0 around/own' but ended up as '3 top/2 around/own'
allow 'scores:none' as shorthand for 'scores:0 t/0 a/!o' (player will be told
whether new score made the list but no scores will be shown)
contents of chests, large boxes, and ice boxes are now immune to water damage
unless the container is cursed, same as for oilskin sacks (previously,
chests+large boxes were always immune and ice boxes always vulnerable)
applying an empty brass lantern in an attempt to light it reported "your lamp
has run out of power"; change to "your lantern is out of power"
when swallowed or underwater, player could be told about events (such as a
shapechanger taking on a new form) that the hero sensed but which
were not shown on the screen; treat being swallowed or underwater as
situations which block telepathy, extended monster detection, warning
some rolling boulder trap feedback was inconsistent
change "killed by <a foo>, while {paralyzed|frozen} by <a foo>" into
"killed by <a foo>, while {paralyzed|frozen}" if the killer caused
hero's helplessness
"It looks very angry" would be given if a hero wielding Excalibur or Demonbane
offended an unseen demon lord
Entering a special room, only wake up the monsters in that room instead of
doing a level-wide wake-up
any blessed key was behaving as if was the rogue's Master Key when unlocking
a trapped chest or box
when an unseen non-pet picks up or uses an item, hero loses known/dknown/
bknown/cknown/lknown memory of that item (so becomes unidentified; in
particular, player won't be asked what to call unseen thrown potion)
wishing for a partly eaten wraith corpse yielded "partly eaten food (1) more
nutritious than untouched food (0)"
if PREFIXES_IN_USE was defined (and VAR_PLAYGROUND forces it to be) when
COMPRESS was also defined (external save and bones file compression
via fork()+exec()), the file name buffer in docompress_file() wasn't
big enough so could overflow and trigger a crash
suppress "This <foo> corpse takes {delicious|okay|terrible}" if preceded by
"You have a bad case of stomach acid" or "Ecch - that must have been
poisonous"
innocuous items like scrolls or eucalyptus leaves did harm when falling on
hero's head after being thrown upward
fighter types who start out knowing all non-magic armor should not know
cornuthaum and dunce cap
prediscovered weapons adjustmens: only knights and samurai know polearms;
rangers know launchers (bows), ammo (arrows), and spears regardless
of their race/species; likewise, rogues know all daggers
if the move counter ever reaches 1000000000, end the game
knights get no metal armor penalty for clerical spells
change touch of death from instadeath to maxhp reduction and damage
dying from being level-drained below level 1 killed hero without saying so
and jumped straight to "do you want your possessions identified?"
conflict will now consider your charisma and requires line of sight
boost hit points of some golems
make anti-magic fields drain more energy and prevent them from showing up
too early in the dungeon
eating magical monsters such as wizards or shamans may give a mild buzz
make exploding spheres create an actual explosion
pets are more careful about attacking monsters at low health
allow killing your quest leader to open the quest
give King Arthur Excalibur
when moving the cursor to examine the map, have '^' move to next trap even if
that trap is displayed with some other symbol (web, vibrating square)
change valkyrie and warrior (valk quest) monsters from chaotic to lawful
change attendant (healer quest) monster from lawful to neutral
quit is not longer bound to M-q
change default value of autopickup to off and color to on
resurrected corpse of mon could end up with different gender from original mon
using a bullwhip to snatch a wielded cockatrice corpse from a monster when not
wearing gloves and without life-saving could trigger "obj_is_local"
panic during final cleanup
make fire-command autowield an appropriate launcher and add fireassist boolean
option to toggle the assistance off
Angels and priests were always described as "the {Angel,priest,high priest} of
<deity>" when first two should have been "{an Angel,a priest}..."
shopkeepers can remove pits and webs
perm_invent: when buying shop goods using itemized purchasing while persistent
inventory window was enabled, the prices of unpaid items went away as
soon as any item was bought (actual item-by-item purchase worked ok)
perm_invent: making an engraving which reduced known enchantment of a weapon
or known charge count of a marker didn't update persistent inventory
change getloc fastmove keys in number_pad mode from hardcoded HJKL to the
run/rush movement keys (meta+number)
allow using rush/run prefix key in getloc to fastmove the cursor
avoid "it" in messages "Wait! There's an it hiding under <an object>!" (hero
moving) and "It was hidden under <an object>!" (unseen monster moving)
don't extinguish burning objects when engulfed by a fire vortex
allow wishing for a novel via description "paperback book" (previously only
worked when specifying "paperback spellbook")
deal with gold leaving a shop via scatter()
defer encumbrance check during polymorph to new man; newman() -> redist_attr()
-> encumber_msg() could report change in encumbrance that immediately
became obsolete if polyman() subsequently restored old attributes
fix heap-use-after-free when attacking monster with potion
for "a" vs "an", add ukulele and uke as exceptions for "an u<anything>"
add new extended command #retravel
remove special doinv key, functionality was equal to BIND=0:inventory
some monsters should not have been scared of bugle playing
monsters that drowned would never leave a corpse (holdover from decades ago
when it wasn't possible to recover anything from a water location)
give alternate message if hero is blind when throne gives "your vision clears"
monster wearing an alchemy smock was only getting poison resistance from it,
not acid resistance; give both properties, just like for hero
in wizard mode, knowing teleport away spell resulted in ^T always attempting
the spell instead of teleporting on demand
describe a couple of isolated moat spots on Samurai quest home level as water
rather than as moat
crawling out of water to avoid drowning didn't work as intended when trying
to move diagonally through a tight squeeze
in wizard mode, polymorphing into hero's role monster in order to revert to
normal form would complain about missing light source if hero was
changing back from the form of a light-emitting monster [didn't affect
normal play because role monsters are invalid polymorph targets there]
revise a 3.6.1 fix: if a spellbook which is being read becomes cursed, always
stop reading: "The <book> slams shut!" and set book->bknown
concealed mimic could trigger sanity check warning "mimic concealed as an
object despite Prot-from-shape-changers" if hidden as "strange object"
cancelled shape changer would become uncancelled if saved and restored (even
just leaving its level and then returning)
don't include time spent suspended in background (^Z) or in shell escape (!)
in the total elapsed time recorded to xlogfile
if a monster is starting to turn into green slime, eat the corpse, tin, or
egg of any creature that might polymorph into a fiery monster to cure
the slime, not just of one of a chameleon
yet another fix for display problems during restore: if game is saved while
hero is hallucinating but that's suppressed because of wielding
Grayswandir, hero is riding, and the steed is on or over an object,
restore will try to update hero's spot when making sure objects aren't
being obfuscated by hallucination, but when displaying the hero there
instead it would access steed pointer before that has been set up
resistances gained from worn or wielded items also protect hero's inventory
non-metallic gloves protect worn rings from shock
message "Oops! food rations out of your grasp!" occurred due to perm_invent
in mid-operation overwriting all of xname's/doname's obufs; fixed by
having hold_another_object() defer perm_invent update til done with
all its args (so fixed as a side-effect of "spurious add and remove
perm_invent updates" above, prior to being reported as #K3401)
similar "The ogre lord yanks Cleaver from your corpses!" due to caching the
result from makeplural(body_part(HAND)) then having a perm_invent
update clobber that; fixed by having inventory display release the
obuf used for each item so that the same one will be reused for the
next item, to avoid churning through the whole pool of obufs
gas clouds are a little random in how they spread out from a point
Izchak occasionally stocks wands/scrolls/spellbooks of light
data tracking for #overview was mis-using u.urooms[] and after being in a
situation where hero was in multiple rooms at once, visiting other
levels might flag unvisisted rooms as having been visited
special damage attacks by the Riders and by fatal-illness inflictors such as
Demogorgon did no damage against other monsters, only against the hero
using obj->o_id to control 'random' behavior of a helm of opposite alignment
could potentially be controlled by player when wishing for such
obj->o_id might be set to invalid value 0 when a partly used up stack had a
dummy copy added to a shop's bill or when a bones file was loaded
(in theory that could happen on any system but in practice it could
only happen on a configuration that uses 16-bit ints)
if a Rider or displacer beast swapped places with a single-segment long worm
the segment co-located with the head wasn't moved with that head;
if sanity_checking was enabled a warning could be triggered:
mon (000000) at seg location is not worm (123abc)
blessed scroll of remove curse read while confused blesses or curses any
uncursed items in inventory, but if hero was dual-wielding and the
scroll cursed the secondary weapon, that would be dropped and further
object traversal would process items on the floor at hero's spot
instead of the rest of inventory
can now use m<dir> to try to move to an adjacent boulder's spot without
pushing it; hero poly'd into a giant or a tiny creature or carrying so
little as to be able to squeeze there will succeed, others will fail
breaching a shop wall, using locking magic to put a door there, then unlocking
that door yielded a situation where subsequent shop damage repair
produced invalid map data which resulted in an impossible() warning
about "wall_angle: unknown" during map display; similar for a vault
wall if it's the spot where the guard arrives to lead hero out
if vault guard arrives on a boulder in a breach in the vault wall when coming
to lead the hero out, smash that boulder into rocks so that the hero
won't try--and fail, because the guard will be in its way--to push it
when vault walls are repaired, destroy any rocks or boulders at their spots
melting ice timer could persist after the ice was gone from digging or from an
exploding land mine
using 'F'orcefight against iron bars while wielding something breakable could
yield erratic outcome because non-deterministic breaktest() was being
called twice and could yield results that conflicted
have applying a polearm give feedback similar to 'F' for melee weapon when
attacking a wall or boulder
if weight_cap() ever returned 0 (which probably can't happen), using #untrap
to pull a monster out of a pit would trigger a divide by 0 crash
avoid "you now detect it where the vampire bat was" when a vampire shifts from
a bat seen with infravision to an unseen fog cloud
if an artifact gets created as a random treasure drop and then deleted because
it is too big to include with a small corpse, explicitly uncreate it
instead of just discarding it so that it is eligible for use later
when creating random contents for a container, explicitly exclude artifacts
(already implicitly excluded because randomly generated artifacts are
all weapons and containers don't start with any weapons in them)
don't give lance or mattock as starting equipment when creating soldiers
fixup for the insect "legs" (some extraneous walls inside solid stone) on the
baalz level didn't work as intended if that level was flipped
handle flipped level when fixing up the baalz level "eyes" too
prevent normal monster activity from picking up the mines' luckstone or the
Sokoban amulet/bag before hero has done so; relying on scare monster
and/or engraved Elbereth wasn't sufficient to guard the Sokoban prize
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
------------------------------------------------------------------
fix compile when DLB isn't defined
urealtime.realtime was being incorrectly calculated
revised "mysterious force" when climbing out of gehennom could generate
warnings about "rn2(0) attempted" or "rn2(-n) attempted"
after 'w' on split stack patch, wielding '-' would cause an object_lost panic
same patch allowed partial stack from getobj to replace cursed wielded weapon
autounlock of door or chest took no time; chest case depended on whether
anything got looted along with the unlocking
autounlock with artifact unlocking tool didn't do touch check on that tool
autounlock picked Rogue's artifact key over lock-pick or credit card (or
ordinary key depending upon invent order) even for non-rogues who
would be blasted when touching it
wielded aklys had its "(tethered weapon...)" description scrambled
randomized trap name could pick trap #0 which isn't a trap and yielded "water"
if running and Blind or Stunned or Fumbling or Dex < 10, encountering a closed
door orthogonally would keep reporting "ouch! you bump into a door"
repeatedly until eventually interrupted by approaching monster or
hunger or ^C
data.base lookup of an entry with any blank lines would falsely claim that
"'data' file in wrong fromat or corrupted" after some extra checks
were added while investigating tab handling anomalies
using nhl_error() to report a Lua processing problem would clobber the stack
level teleporation's "You materialize on a different level!" could be given
out of sequence with other arrival messages
more sequencing: if wielding Sting or similar and level teleporting to a
level with different warning effect, the start-glowing or stop-glowing
message came before the materialize message on the destination level
prevent "you materialize on a different level" after "a mysterious force
prevents you from descending" if you try to level teleport past the
stairs down from the quest home level before being granted access
creating Mine Town variant 1 (Orcish Town) sometimes complained about being
unable to place lregion type 1 and failed to have any staircase up
set g.context.botl for glove and wielding actions that could start or end
bare-handedness in support of condtests[bl_bareh]
reinstate ranked ordering of the status condition fields
grammar for messages about a monster removing items from a container was bad
some new status conditions didn't always update when they should
fix flipping non-existent stairs and ladders (github #311)
fix door created into random wall or position opening into solid wall
handle gone portal when going back in quest
'use_inverse' option was accidentally made Windows-only; change it back to
being more general; change its default to True
change inconsistent achievement spelling of "Mine Town" to "Minetown"
fix crash in water_damage_chain
teleport feedback "you materialize at another location" was given too soon
'mention_decore' was repeatedly reporting "you are back on bottom" when
moving around underwater
revised 'mention_decor' was describing furniture or ice right before look-here
described the same thing when stepping onto object(s)
poison gas clouds located over known but unlit pools were visible as known
clouds but steam clouds in that situation were not
after the wish parsing change, wishing for "<something of monster>" or for
"<monster something>" worked as intended but wishing for "<monster>"
(where <monster> used the canonical spelling) triggered a crash
fix new "objects[0] class #1 not in order!" panic if plain 'char' is unsigned
only generate shop items on solid floor squares
avoid gcc 10 warning by removing duplicate definition of 'head_engr'
if a monster removed a corpse from an ice box, the corpse would never rot away
monster creation on quest levels could make genocided creatures
enabling wizard mode 'sanity_check' option would complain about invalid mhpmax
value for level N monsters created with a d8 value of 1 for all N d8's
disable that extra check because gremlim HP split after cloning triggers it
some versions of tiles processing (not X11's) complained about the rename of
"{acid,blinding} venom" to "splash of {acid,blinding} venom"
wizard mode #timeout changed to show timed Displacement in 'can be timed in
normal play' section instead of 'timed via #wizintrinsic only' section
the fix to make worm visibility checks work as intended forced the coordinates
of the extra tail segment co-located with the worm monster to match
the worm instead of leaving it off the map; place_worm_tail_randomly()
reverses the segments and can throw some away if there isn't room,
but throwing away the extra segment removed the worm from the map
using 'O' to try to change 'symset' was a no-op; 'roguesymset' worked
change default for lit attribute in special level des.terrain directives to
'unchanged' instead of 'unlit'
replace worm tail placement code that reportedly led to a sanity_check warning
[no actual code problem found; might be compiler bug for 'xchar']
learn scroll of teleportation after reading even when random destination is
right by starting spot
fix off-by-one bug in dimensions of theme rooms
fire/frost horn feedback when zapped by monster was inaccurate (falsely
claimed that it was "directed at self" when attacking hero)
tins of spinach and 'dead' eggs could cause out of array bounds access
attempting to index into mons[] by polyfodder() macro
options help ('? g') listed all boolean options, then repeated them among
the compound options; on OSX they showed a description of "(null)"
but for other sprintf implementations they might cause a crash
change name of #wizlevelflip to #wizfliplevel
dwarves could sometimes pass through walls without digging their way
fix genetic engineers dropping Schroedinger's cat box
the checks and handling for fountains, sinks, and drawbridges were being
missed during liquid_flow
monster movement flags unification allowed displacer beasts to displace Riders
a long worm with no visible segments (but one internal segment) might trigger
warning: tail 'segement' at <0,some_y>, worm at <mx,my> if teleported
adding displacer beast inadvertently introduced a regression in swapping with
pets, allowing them to be pulled into water by hero on/over water
splitting #if MAIL into #if MAIL_STRUCTURES and #if MAIL made it possible to
wish for and write scrolls of mail with MAIL disabled, but attempting
to read such a scroll issued impossible "What weird effect is this?"
remove M2_MALE flag that was unintentionally left on dwarf lord/lady/leader
entry and was preventing female incarnations
tilemap.c wasn't building if STATUES_LOOK_LIKE_MONSTERS wasn't defined; also,
to match the code that should be defined so change the preprocessor
test to 'ifndef STATUES_DONT_LOOK_LIKE_MONSTERS'
ensure that monster female name variation ends up as a female during ^G
arbitrate when there is a conflict between gender term (male or female) and
a gender-tied monster name (cavewoman) during ^G; gender term wins
wizard mode sanity check complained about Wizard's clone mimicking a monster
new ^G gender-naming handling code required a guard against null permonst
pointer which could occur under some circumstances
replace "aligned priest" entries in Pri-loca.lua, astral.lua, minetn-1.lua,
and sanctum.lua, with "aligned cleric"
attempting to swap places with a peaceful monster might cause it to flee
gender-specific monster names can be used in .lua files with the gender upheld
remove unused vision tables
changes accompanying sorting of discoveries resulted in omitting very last
item for '`'/#knownclass on a class where every item was discoverable
and had no extra labels (so potions and rings, possibly others, but
not scrolls or wands) and every item was actually discovered
change to can_reach_floor() resulted in hero being unable to reach the floor
when held by a lichen
panic if lua init fails
change wizard mode command #wizmgender to wizard mode option 'wizmgender'
engraving with non-blade dulled the weapon anyway (pr #464)
'sortdiscoveries:s' had a spurious generic header shown at the start of the
last class if there were any artifacts or unique items discovered
loss of saddle by opening magic left hero mounted on unsaddled steed
avoid segfault during error reporting for bad 'O' value(s) after theme rooms
have been initialized, leaving iflags.in_lua set
avoid complaints of "nothing to foo" for 'force_invmenu' if there are no
likely candidates to foo with but there are hidden acceptable choices
avoid "Not carrying anything. Never mind." for 'force_invmenu'
'altmeta' option could be toggled On but once On could not be toggled back Off
wearing a ring of protection and any amulet behaved as if wearing an amulet of
guarding when determining MC value
messaging for genetic engineer attacks had several problems
give genetic engineers teleport capability (as they had in slash'em); 'port
away after polymorphing someone so that they don't just repeat that
if an invisible hero managed to convert an unaligned altar to an aligned one
with color enabled, altar wasn't immediately redrawn with new color
repair some regressions to (a)pply introduced by "getobj refactor" patch
getobj too: allow attempting to (E)ngrave with any item in inventory
fix ^X feedback when held typo: "unseen createure" -> "unseen creature"
if a <foo> corpse was set to revive as a <foo> zombie and corpse was partly
eaten at revival time and monster <foo> is defined as providing more
nutrition that <foo> zombie, oeaten_stat() could give the warning
"partly eaten food more nutritious than untouched food" when used to
calculate zombie's hit points (depended upon how much had been eaten)
undead turning magic revived corpses flagged as no-revive if they were being
carried but not if they were zapped while on the floor
forgetting an item's known/dknown/bknown/&c settings when picked up by unseen
monster made it possible to trigger a latent shop bug with globs;
avoid clearing dknown flag for globs
fix globby_bill_fixup to use shopkeeper instead of Null for glob pricing
applying a book to check readability treated novels as if they were spellbooks
#version was leaving the 'in_lua' flag set and if subsequent 'O' issued an
error (example was an attempt to interactively set bouldersym to an
invalid value), the error reporting routine crashed via segfault
lighting for baalz level defaulted to random and could end up being lit
when using 'O' to set menu color patterns, the reminder message that the
boolean menucolors option needs to be set to True for them to work
was sometimes given even when already True
stair revamp unintentionally resulted in cursed potion of levitation no longer
causing hero to hit head on ceiling
enlightenment/disclosure when wielding two weapons with two-weap skill higher
than secondary weapon's skill had "with" duplicated in the feedback
corpse of monster with gender specific names (king vs queen and so forth)
was always described by the neutral name (ruler and such)
prevent obj_pmname() from calling mon_pmname(monst) when monst->data is null
to prevent a null pointer dereference
correct the pluralization of monarch to monarchs, rather than monarches
don't allow web spun by spider to interfere with solving Soloban
fix parsing of wish adjectives (return value broken by changes accompanying
figurine gender patch)
when picking up a thrown weapon while quiver is empty, don't put it into the
quiver slot if it needs to be wielded for throw-and-return action
using bhitpos in flooreffects to handle erosion damage broke its original use
of tracking wand zaps if a teleportation zap hit an object; subsequent
zap traversal was done from object's landing spot rather than from its
zap hit spot, resulting in scrambled wand targetting
restore previous behavior of the 'altmeta' option (only wait for a second
character when getting a command keystroke, not other key input)
baby gold dragons weren't able to grow into adult gold dragons
when hero is displaced, make monsters who try to stay out of direct line do so
with spot where they think the hero is rather than where he really is
if hero died while wearing gold dragon scales/mail and left bones, they would
still be emitting light without being worn when bones got loaded
if an invisible monster put on or took off armor while out of hero's sight
spurious message "Suddenly you cannot see it" would be given
an item thrown or dropped while swallowed was treated as being picked up by an
unseen monster so object fields {known, dknown, bknown} got cleared
segfault if gremlin fled weaponless hero wearing gold dragon scales/mail
'disambiguate WHACK' patch affected field layout of objects[] but EDITLEVEL
wasn't incremented, allowing incompatable save files to be restored
restore the boulder exception for piletops that had been unintentionally
removed during the expanded-glyphs changes
misaligned potion colors due to lack of reset_glyphmap() following obj shuffle;
this issue only impacted a new game
closed doors were described as "horizontal closed door" or "vertical closed
door" instead of just "closed door"
curses: 'msg_window' option wasn't functional for curses unless the binary
also included tty support
curses: line input that doesn't take place on the bottom line of the message
window uses a canned curses routine and doesn't support ESC to kill
partial input or to cancel; "Who are you?" prompt was willing to name
a character "^["; have the popup version of getlin() fake the usual
ESC handling, but player has to type <escape><return> for that to work
curses: menu headings didn't use default text color
curses: #perminv changes disabled menu_headings attribute for persistent
inventory window headings; reinstate that
Qt: at Xp levels above 20 with 'showexp' On, the combined status field
"Level:NN/nnnnnnnn" was too big and truncated by a char at each end
Qt: searching a text window for something that wasn't found and then searching
for some other target could crash
tty: redraw unexplored locations as S_unexplored rather than <space> after
map has been partially overwritten by popup menu or text display
tty: previous change resulted in remnants of previous level being shown on
new level after level change when S_unexplored is <space>
Unix: after lua changes to Makefiles, 'make spotless' for dat subdirectory
left some generated data files which should have been deleted
Windows: new tile additions in win/share did not trigger the creation of a new
NetHackW.res file
Windows: nhl_loadlua() was missing the RDBMODE argument on the [dlb_]fopen(),
which is required on Windows to set binary mode; binary mode is
required in order to be able to reliably navigate through a file using
fseek(), ftell() and fread()
Windows: when VIRTUAL_TERMINAL_SEQUENCES was not defined, the preprocessing
would fail on consoletty.c
X11: was still initializing map to 'stone' instead of 'unexplored' after they
became separate glyphs
X11: for text map without color, add support for black&white ice; draw it in
inverse video to distinguish from ordinary floor
X11: if perm_invent is set in NETHACKOPTIONS or config file, start with the
persistent inventory window displayed
X11: use visctrl(response) when X11_yn_function() echoes prompt+response in
message window
X11: when trying to lookup scrollbars in order to handle scrolling via keys,
menu handling always ended up finding the top window
X11: enable horizontal scrollbar for persistent inventory window
X11+OSX: after the "bad Atom" fix (below), the persistent inventory window
crept downward every time it got updated
Platform- and/or Interface-Specific Fixes
-----------------------------------------
SYSCF: treat most sysconf directives that have invalid values as warnings
rather than errors; use a conservative default value and continue
curses: for vertical status, line up conditions in columns; usually two but
condense to three per line if the status window isn't tall enough
[at present, highlighting with inverse video includes trailing spaces
used to align entries in their columns--that's a feature...]
curses: indent items in perm_invent window by one space
curses: don't change the terminal's default colors
curses: remove unnecessary special handling for dark gray
curses: sometimes entering a count during menu selection caused the menu to
disappear (example was apply/loot in-out container menu with two or
more digits typed followed by non-digit); in-out menu was still active
but no longer displayed
curses: support backspace/delete when entering a count during menu selection
macOS: Xcode project was failing to build if the path to the NetHack source
tree contained a space; the issue was within some shell script code
contained within the project
msdos: add -DSTATUES_LOOK_LIKE_MONSTERS to Makefile1.cross so the VESA mode
can display statue glyphs
Qt: quit if can't load tiles file instead of continuing and then segfaulting
Qt: [later] tiles load failure at startup now continues using an ascii map
Qt: use more columns for extended command selection dialog so that the number
of rows needed doesn't result in some commands being unaccessible
Qt: suppress wizard mode commands from '#' handling when not in wizard mode
Qt: organize extended command selection grid by columns instead of by rows
(first N entries down left column, next N entries down 2nd column, &c)
Qt: when selecting an extended command by typing its name, support <delete>
(aka <rubout>) in addition to <backspace> to go back a character
Qt: switch to fixed-width font for menus
Qt: don't disable [cancel] button when viewing inventory or other pick-none
menus; ESC works to dismiss those and [cancel] should be the same
Qt: clicking on the window's Close button brought up a dialog offering
choices of "Save" and "Cancel"; picking Cancel sent nethack into an
infinite loop with complaints about Qt's event loop already being
active; change dialog: offer "Save and exit" or "Quit without saving"
with no opportunity to try to back out of the Close operation
Qt: add 3.6 status fields Stone, Slime, Strngl, Deaf, Lev, Fly, Ride
Qt: add Attributes, Overview, and Annotate to the "Info" pull down menu
Qt: rename menu entries game->Save to game->Save-and-exit and game->Quit
to game->Quit-without-saving
Qt: menu commands are now working; commands invoked via M-c were having that
keystroke changed to '?', bringing up nethack's help menu; now those
send #abc with just enough letters to disambiguate from other commands
("Compilation" is one remaining problem; it yields "#version" which
brings up '#' menu subset with choices of "version" and "versionshort")
Qt: "paper doll" subset of persistent inventory has undergone several changes:
show previously missing quiver below weapon instead of duplicating
gloves there; show secondary weapon in shield slot and blank out
alternate weapon slot when two-weapon combat is active; show wielded
two-handed weapon in both the shield and primary weapon slots; show
first active light source in a previously unused slot on lower right;
show first leash-in-use in a previously unused slot on lower left
Qt: paper doll inventory view was inconsistently updated during Hallucination
Qt: when hero died, gold on tombstone only included gold in inventory, not
any additional gold inside carried containers; also, inventory gold
will be zero if bones get created for all 3.6.x and for 3.4.x+GOLDOBJ
Qt: tombstone showed newly constructed date instead of the value set up at
time of death; it only shows year but that could be wrong if player
stared at or ignored prior --More-- for long enough on 31 December
Qt: menu choices All, None, Invert were setting, unsetting, or toggling menu
entry checkboxes internally but didn't redraw the menu to show that
Qt: fix the F1/F2/Tab macro keys to not require that number_pad be On
Qt: unhighlight highlighted message (last one issued) after player has seen it
Qt: update message window's last message with player's response if it's a
prompt string for a single-character of input (ynaq or invent letter)
Qt: for line input, display the prompt+response in the message window
Qt: enable the popup_dialog WC option (result is a bit flakey but usable)
Qt: 3.6 catchup - show unexplored locations as unexplored rather than as stone
Qt: tried to honor 'showexp' but the value was unintentionally suppressed by
[lack of definition for] obsolete conditional EXP_ON_BOTL
Qt: implement --More-- prompt to support MSGTYPE=stop
Qt: for menu search, don't require clicking on the search target popup before
typing target string (was using typed letters to make menu selections
if player didn't click on the popup first)
Qt: rest ("Zz") button on the toolbar only worked when 'rest_on_space' was On
(core issue, not Qt's fault)
Qt: rename toolbar button "Get" and action menu choice "Get" to "Pick up"
Qt: status icons for alignment|hunger|encumbrance which started out centered
relative to the label text below them would shift to being left
justified when status got updated
Qt: handle '&' properly if it occurs as part of yn_function popup dialog
Qt: fix the display side of saved game selection; character names for
available save files are shown in a column of push buttons instead
of each button overwriting all the ones before it
Qt: don't clobber an existing save file after choosing "new game" in the
saved game selection widget
Qt: don't get stuck in a loop after choosing "play" while the character name
field is empty in the character selection widget
Qt: when a new message is issued, pan the message window to its left edge if
player panned it horizontally then didn't manually scroll it back
Qt: there was no way to enter extended command "#version" by typing; command
name matching was waiting to disambiguate it from "#versionshort"
and the only way to that was to type #version<return> but <return>
explicitly triggered rejection, cancelling '#' processing; #drop vs
"droptype, "known vs "knownclass, and #takeoff vs #takeoffall are in
similar ambiguous situation but usually invoked via keystroke
Qt: render all text windows in fixed-width font instead of just ones which
have one or more lines with four consecutive spaces; some data.base
entries do have those (usually final attribution) and some don't,
so display from one entry to another was inconsistent if default
proportional font was ever used
Qt: while a text window was shown (such as the "things that are here" popup
when stepping on items), typing commands had the input passed on to
the map and then executed; sometimes that caused the not-yet-dismissed
text window to hang
Qt: {maybe just Qt+OSX:} when viewing a text window ('V' to look at 'history'
for instance), clicking on [Search], entering a search target in the
resulting popup and clicking on [Okay] or typing <return>, the text
window got pushed underneath the main window so seemed to go away
Qt+OSX: fix control key (fixed all except for ^V); handle ^V as a shortcut key
Qt+OSX: rename menu entry "nethack->Preferences..." for invoking nethack's
'O' command to "Game->Run-time options" and entry "Game->Qt settings"
for making persistent Qt customizations to "nethack->Preferences..."
Qt+OSX: prevent game->Quit-without-saving from being hijacked for the nethack
menu by renaming it game->_Quit-without-saving (OSX only)
Qt+OSX: add a separate nethack->Quit menu entry with different functionality;
Command+Q invokes it
Qt+OSX: since menu entry help->"About Qt NetHack" gets hijacked and becomes
"nethack->About nethack", add a separate help->_About_Qt_NetHack_
which stays where intended and brings up the same information
Qt+OSX: suppress unwanted "Search [______]" action from being inserted as the
first entry in the menubar's "Help" dropdown menu
tiles: add indicator of thonged portion to aklys tile
tty: role and race selection menus weren't filtering out potential choices
which got excluded by OPTIONS=align:!lawful or !neutral or !chaotic
tty: '$' can now select gold in a menu even when it isn't on current page
Unix: when user name is used as default character name, keep hyphenated value
intact instead stripping off dash and whatever follows as if that
specified role/race/&c (worked once upon a time; broken since 3.3.0)
Unix: add "ec2-user" to the list of user names 'sysconf' classifies as generic
user_sounds: move the message hook from inside individual window display ports
to the core where it allows MSGTYP_NOSHOW msgtyp's to still trigger
sounds to correct a reported github issue; also fixes a past reported
issue that the curses port on Windows not working with user_sounds
Windows: update for new status condition fields
Windows: include commented-out 'PORTABLE_DEVICE_PATHS' in sysconf.template
X11: substantial overhaul of status display, both 'fancy' and 'tty-style'
X11: extend fancy status one-turn inverse video status-change highlighting to
hunger, encumbrance, and conditions
X11: stop including unused column 0 in the map
X11: avoid 'bad Atom X Error' when perm_invent is enabled (seemingly window
manager dependent)
X11: toggling 'perm_invent' off via 'O' didn't dismiss persistent inventory
window
X11: with 'slow' resource set to False, the pop up yn_function didn't always
resize properly when re-used
X11: (possibly X11+OSX): if persistent inventory was displayed at time of
end-of-game prompting, prompting would stall until that window was
manually dismissed
General New Features
--------------------
if a killer bee encounters a lump of royal jelly and there is no queen bee on
the level, the bee will eat the jelly and become a new queen
automatic annotation "gateway to Moloch's Sanctum" for vibrating square level
once that square's location becomes known (found or magic mapped);
goes away once sanctum temple is found (entered or high altar mapped)
savefile: add support to deconstruct internal data structures down into their
individual fields and save those fields instead of the entire struct
savefile: use little-endian format for fields where that makes a difference
replace build-time level compiler and dungeon compiler with run-time loading of
the dungeon and level descriptions and interpreting them via Lua
split off some of the functionality that was in makedefs (compiled-in options
build date/time, etc) so that it can be built by a cross-compiler
and accessed on the target platform
replace quest.txt and associated conversion to quest.dat via makedefs with
Lua quest texts loaded at runtime
callback lua functions from core at certain game actions
some altars are displayed in different colors (for tty and curses at least)
add 'quick_farsight' option to provide some control over random clairvoyance
where pausing to be able to browse temporarily visible aspects of the
revealed map can seem intrusive; doesn't affect clairvoyance spell
replace "money" in in-game texts with "gold"
when hallucinating, see hallucinated currencies instead of bits for an ale
when hallucinating, see hallucinated liquids when looking at water or lava
on the map
applying a spellbook hints about read charges left
wizard mode wishing for level topology can now create hidden doors (ask for
"secret door" when at a door or wall location), hidden corridor
spots ("secret corridor" at a corridor location), clouds and walls
tiny chance for randomly created spellbooks to be Discworld novels instead
of having only one in the first book or scroll shop created (won't
occur in hero's initial inventory or NPC priest inventory or be
bestowed as a prayer boon or be found in statues)
'goldX', 'implicit_uncursed', and 'mention_walls' options changed to be
persistent across save/restore
wearing a wet towel confers "half damage from poison gas" attribute
for end of game disclosure and dumplog, show 'achievements' (previously only
available as an encoded value in xlogfile) along with 'conduct'
more grades of self-appearance than beautiful or handsome vs ugly
when 'color' if Off and 'use_inverse' is On, draw ice on the map in inverse
video if it uses the same character as room floor or as dark floor
new 'mention_decor' option; when On, describe dungeon features being stepped
on or floated/flown over even when they're not covered by objects
applying royal jelly on an egg kills, revives, or changes the egg
intelligent monsters pick up and rummage through containers
toggling 'travel' option Off now only inhibits travel by mouse click, not by
'_' command where choosing the destination provides a chance to cancel
different glyphs and symbols for stone and unexplored areas
new glyph GLYPH_NOTHING was added so !dark_room has something to be set to
now that stone could be mapped to an entirely different symbol
added several new status conditions all of which are opt-in except
the new cond_grab and cond_lava which are opt-out
tipping your cap might get a response
special levels can be flipped horizontally and/or vertically
new special level initialization routine, "swamp"
demon lords and princes suppress teleporting in Gehennom
for !fixinv option where inventory letters normally don't stick, try to put
a throw-and-return weapon back into the same inventory slot it gets
thrown from; only works if it does return and is successfully caught
wizard mode #wizborn command
include more skill information in ^X output when dual-wielding
include monk's to-hit penalty for worn suit in the status section of ^X output
item-using monsters will zap wand of undead turning at corpse-wielding hero
when the corpse is harmful
boiling a pool or fountain now creates a temporary cloud of steam
random themed rooms in the dungeons of doom
extended achievement and conduct fields for xlogfile
record amount of gold in hero's possession in xlogfile
new objects: amulets of flying and guarding, gold dragon scale mail and
set of gold dragon scales
new monsters: displacer beast ('f') and genetic engineer ('Q'), gold dragon
and baby gold dragon (both 'D')
make camera flash which reveals previously unseen map features or objects or
monsters record those on the hero's map; monsters revert to 'unseen'
boolean options can optionally have the form "name:value" with value taken
from among "true", "yes", "on", or 1 and "false", "no", "off", or 0
record number of wishes and artifact wishes in xlogfile
give feedback for '#chat' directed at walls
add 'Sokoban' conduct, tracking the number of times the special Sokoban rules
which incur luck penalties have been violated; don't report it
unless/until Sokoban branch has been entered
reduce verbosity when a mind flayer attacks a headless monster; when a
tentacle-to-head attack hits but fails to accomplish anything skip
remaining attacks (mind flayer has 3, master mind flayer has 5)
add section marker [] support to run-time config file; CHOOSE section1,section2
followed by [section1] ... [section2] ... forced all the rest of the
file to be part of the last section; that still works the same, but []
can be used to terminate the last section and revert to common options
for the remainder of the file
render the color names in the corresponding color when using the pick-a-color
menu for adding status highlights or menu colors via 'O'
reading blessed scroll of teleportation confers one-shot teleport control
mild zombie apocalypse
list lamps and lanterns in charging prompt
let tourists read conical hats
when "?i" (show key bindings) displays commands and their keys, also show
commands without any key (so ones useable via '#', or possibly menu,
only; the majority are debugging commands)
assign default key binding for <del> or <delete> to execute #terrain
assign M-X to #exploremode
make #herecmdmenu and #therecmdmenu autocomplete
add 'sortdiscoveries' option to control output of '\' and '`' commands
include an indication of monsters' health during farlook feedback (including
/M and autodescribe); also include it in death reason when killed by
a monster: "killed by {an uninjured newt,a heavily injured mumak}"
[later: suppress the indication of monsters' health]
make DOAGAIN (^A) become unconditional; commenting it out in config.h makes
it be bound to NUL, a no-op, but allows BIND=k:repeat to set it to k
add support for a single monster species to have distinct male, female,
and gender-neutral naming terms
add support for a single monster species to have distinct male and female
tiles
consolidate several monsters that differed only by their gender into their
single species
added wizmgender debugging command to display female monsters in red inverse;
helpful for debugging gender-related matters on tty; currently ignored
on other window ports [later: changed from command to boolean option]
record number of encountered bones levels in xlogfile
add bonesless to extended conducts field in xlogfile
show bones levels information in enlightenment at end of game or in explore
and wizmode
for #wizintrinsic, use any counts entered during menu selection
give feedback when boolean options are toggled interactively ('O' command)
'|' command (#perminv) for interacting with persistent inventory display
(curses and X11 only)
menu_shift_left, menu_shift_right menu command keys; default '{' and '}'
(curses for perm_invent only; implemented for X11 too but menus for
it lack horizontal scroll bars so the shifts don't work there)
using 'f' while quiver is empty and 'autoquiver' is Off when wielding a
thrown-and-return weapon will throw that weapon instead of filling
the quiver (inspired by xNetHack)
3.6's tribute: add one new passage to Sourcery, three to Small Gods, one to
Lords and Ladies, two to Soul Music, three to Interesting Times, four
to Maskerade, three to Hogfather, two to Jingo, four to The Last
Continent, four to Carpe Jugulum, three to The Fifth Elephant, five
to The Truth, six to Thief of Time, six to The Last Hero, four to
The Amazing Maurice
monsters can see and remember hero resistances
monsters can gain resistances by eating corpses
menu for what-is command supports /^ and /" to view a list of nearby or whole
level visible and remembered traps
spiders will occasionally spin webs when moving around
drinking a burning potion of oil will cure being turned into slime
new bigroom variant, a boulder maze
vomiting on an altar provokes the deities wrath
branch stairs have a different glyph, show up in yellow color in tty
duration of confusion when drinking booze depends upon hunger state
using 'D' allows dropping items picked up previously
bones piles can be ransacked by adjacent monsters
Platform- and/or Interface-Specific New Features
------------------------------------------------
user_sounds: provide an experimental mechanism for terminal-side sounds similar
to the method used for vt_tiledata; new option vt_sounddata that also
requires compile-time definition of TTY_SOUND_ESCCODES (also requires
terminal-side code external to NetHack to recognize the sequence and
act on it)
curses: implement 'selectsaved', restore via menu of saved games
curses: implement selecting menu items via mouse
curses: 'windowborders' can be set to 3 or 4 to suppress perm_invent borders
to provide slightly more room for actual inventory info
curses: if panictrace is triggered, reset the terminal before giving backtrace
Qt: the "paper doll" inventory subset can be controlled via the "Qt Settings"
dialog box ("Preferences..." on OSX)
Qt: draw a border around each tile in the paper doll inventory; when BUC is
known for a doll item, change the border's color and thicken it
Qt: letting the mouse hover over the paper doll shows a tool tip describing
the object--or lack of same--in the slot under the pointer
Qt: clicking on the paper doll runs the #seeall command (inventory of wielded
and worn items plus tools [lamps, leashes] actively in use; in other
words, same set of things whose tiles are used to populate the doll)
Qt: clicking on the status window runs the #attributes command (^X)
Qt: add a Search button to the toolbar
Qt: support the 'hitpointbar' option
Qt: add Filter, Layout, and Reset buttons to the extended command selector;
Filter is only useful in wizard mode, allowing changing the set of
extended commands between "all", "normal mode only", "extra wizard
mode only"; Layout redisplays the grid of command buttons, toggling
from down columns to across rows or vice versa; Reset puts both back
to their default settings and clears any pending typed input
Qt: [later] augment extended command selection dialog's Filter to add a
fourth subset, those commands which autocomplete when typed for tty,
typically commands with no keystroke or only meta character keystroke;
that makes Filter useful in normal mode (much shorter list of choices)
tiles: male and female variations in monsters.txt; tested only with tile2bmp
conversion utility so far; also supported by tilemap utility to
generate tile.c
tty: use bright colors directly on supporting terminals
Unix: can define NOSUSPEND in config.h or src/Makefile's CFLAGS to prevent
unixconf.h from enabling SUSPEND without need to modify unixconf.h
X11: implement 'selectsaved', restore via menu of saved games
X11: echo getline prompt and response (wishes, applying names) to message
window and dumplog message history
NetHack Community Patches (or Variation) Included
-------------------------------------------------
hallucinatory trap names (pr #174 by copperwater)
autounlock feature originally from unnethack (pr #228 by copperwater)
replace "You feel cold" message for freezing unseen door (pr #265 by
copperwater)
applying a candelabrum with no candles gives a tip (pr #265 by copperwater)
candelabrum now reads "(n of 7 candles attached)" (pr #265 by copperwater)
show appropriate message on throne when crowned (pr #265 by copperwater)
choir chanting, bathing in darkness for death by Moloch (pr #265 by
copperwater)
remove "iron hook" unidentified description (pr #265 by copperwater)
suppress "Unknown command" messages in the dumplog. (pr #265 by copperwater)
give player message informing them they can use #enhance (pr #265 by
copperwater)
neutral sacrifices disappear in a cloud of smoke (pr #265 by copperwater)
call potion bottles by nonsensical names if hallucinating (pr #265 by
copperwater)
add a default message for chatting to gnomes (pr #265 by copperwater)
better reporting directions for impossible() (pr #265 by copperwater)
underwater fire scroll causes vaporization (pr #265 by copperwater)
default shk sell prompt to N (pr #265 by copperwater)
teach non-mindless monsters about the Castle trapdoors (pr #265 by copperwater)
always print a message when the hero teleports (pr #265 by copperwater)
always print a message when the hero level teleports (pr #265 by copperwater)
remove Sokoban luck penalties for actions you can't cheat with (pr #260 by
copperwater)
sounds for minotaurs (pr #298 by NullCGT)
correct the Guidebook descriptions for msdos video_width and video_height to
state that they work with video:vesa; the video:vga setting that was
described there forces the 640x480x16 mode where video_width and
video_height don't operate (pr #294 by chasonr)
redo rndmonst() to operate in a single pass (pr #286 by copperwater )
fix the "stuck pets" issue (issue #329)
allow themed room subrooms to be filled (pr #347 by copperwater)
allow rereading spellbooks to refresh memory at any time (pr #261 by
copperwater)
allow themed rooms constrained by level difficulty (pr #344 by copperwater)
add a varied form of LIBNH nethack library contribution (pr #385, #403
by apowers313)
add cross-compile to WASM (pr #385, #403, #412 by apowers313)
differentiating gendered monster tiles (pr #430 by NullCGT)
check bones data directly for deja vu messages (pr #374 by entrez)
unify code for extracting an object from a monster's inventory (pr #455 by
copperwater)
make engraving an occupation (pr #460 by copperwater)
fpostfx index out of bounds when eating standard eggs (pr#547 by janne-hmp)
"readable" Hawaiian shirt designs (pr#407 by entrez)
permit blind feeling for objects on trap door and fix up msgs when dropping
on trapdoor (pr#574 by entrez)
travel from 'interesting position' (pr #575 by entrez)
running on ice sent hero in weird directions (pr #588 by copperwater)
delete extra lines in Guidebook.mn (pr #590 by argrath)
supply missing changes on Guidebook.tex (pr #591 by argrath)
fix out-of-bounds access of xdir and ydir in farlook (pr #592 by copperwater)
variation of imp's period-speak (pr #602 by Vivit-R)
fix m-prefix movement into warning symbol (pr #573 by entrez)
pointer precedence fix incrementing flagcounter in do.c (pr #612 by argrath)
MAX_RADIUS defines the outer bound of the radius table, so leave it at 15
to avoid out-of-bound access in view_from() and do_clear_area()
(pr #613 by argrath)
variable attknum was declared without initialization, and was used in
find_roll_to_hit() (pr #615 by argrath)
check for NULL lua_State before calling lua_close() (pr #616 by argrath)
use %lu, not %d, in format string in timer_sanity_check() (pr #617 by argrath)
Code Cleanup and Reorganization
-------------------------------
new core file insight.c - move enlightenment and conduct from cmd.c to it,
also move vanquished, genocided, and extinct monsters from end.c,
and move one-line stethoscope/probing feedback from priest.c
move majority of global variables into instance_globals struct g
move zeroobj, zeromonst, zeroany into const_globals struct cg
remove STATIC_DCL, STATIC_OVL, STATIC_VAR, STATIC_PTR
old Qt moved from win/Qt to win/Qt3 and files renamed to use qt3_ prefix
more current Qt for Qt version 4 and 5 moved from win/Qt4 to win/Qt; qt4
moniker changed to qt_
window-port-interface: add_menu() modified to take a more general itemflags
parameter to support uses beyond just 'preselected'
window-port-interface: start_menu() modified to take a new mbehavior parameter
add some bounds checking to tabexpand (doesn't prevent the apparent compiler
optimization bug that put homebrew OSX executable into endless loop)
unified breamm and breamu
added some stair helper functions
unified the code for finding a queen bee
unified the code for multishot class bonus code
unified the code for obtaining the inventory letter value for sortloot
unified the code for (un)locking boxes in inventory
unified the code for finding room pos for some features
unified the code for revealing hiding monsters for mvm attacks
options overhaul: moved the option definitions into include/optlist.h;
combined the boolean and compound options into one allopt[] array;
each option has its own individual function for setting the option,
for retrieving the option value, and for processing the option
following its selection in the 'O' menu, added doc/options.doc file.
function reglyph_darkroom() relocated from options.c to display.c
resurrect 'makedefs -m' to be able to derive default mons[].diffculty values
suitable for assigning to new or changed monsters
convert obj->oextra->omid from pointer to scalar
get rid of unused obj->oextra->olong
relocated unmaintained code to outdated folder, specifically sys/amiga,
sys/atari, sys/be, sys/mac, sys/os2, sys/wince, win/Qt3, win/gem,
win/gnome, include/amiconf.h, include/beconf.h, include/def_os2.h,
include/os2conf.h, include/macconf.h, include/tosconf.h,
include/wceconf.h
removed SYSFLAGS conditional code
removed MFLOPPY conditional code
get rid of 3.6.1 workaround needed to retain compatibility with 3.6.0 bones
files after fix for 3.3.0 through 3.6.0 bug for invalid 'bonesid'
designation in bones of quest levels
add an additional note to mextra.h and obj.h comments that reminds people to
appropriately init new fields if they need to initialize to something
other than zero
rework stairs structure into a linked list
move 'restoring' to the program_state struct; add corresponding 'saving';
both used to enforce no updating of status lines or of persistent
inventory when the relevant activity is in progress
unify special attack damages from separate you-hit-monster, monster-hits-you,
and monster-hits-monster into functions by damage type
unify trap effects for hero and monster stepping on the trap by trap type
replace the single permonst mname field with male, female, and gender-neutral
names pmnames[NUM_MGENDERS] fields
adjust window port interface to pass a pointer to a glyph_info struct which
contains the glyph itself, the ttychar, the color, the glyphflags,
and the symset index; this affects two window port calls that get
passed glyphs: print_glyph() and add_menu().
switch from k&r C to C99
remove the game-compile dependencies on any pre-generated header files
date.h dependency and inclusion is removed and comparable functionality is
produced at runtime; REPRODUCIBLE_BUILD capability will need to be
reviewed and adjusted
pm.h dependency and inclusion is removed and comparable functionality is
produced by moving the monster definitions from monst.c into new header
file called monsters.h, then taking advantage of the C preprocessor to
generate appropriate enum values during compile
onames.h dependency and inclusion is removed and comparable functionality is
produced by moving the object definitions from objects.c into new header
file called objects.h, then taking advantage of the C preprocessor to
generate appropriate enum values during compile
artilist.h is used to generate appropriate artifact enum values by the C
preprocessor during compile
remove requirement of object probabilities adding to 1000
delete obsolete variable 'g.monstermoves' (copperwater pull request #579)
expand glyphs to map wall styles that can vary between main, mines, gehennom,
knox and sokoban; tile interfaces were already doing that on the fly
by swapping several tiles in and out on those levels
expand glyphs to map altars that can vary between unaligned, chaotic,
neutral, lawful and other; tty was already doing that on the fly
per map cell via display code
explosion types are mapped and can vary between dark, noxious, muddy, wet,
magical, fiery and frosty; tile interfaces already had unique tiles
for each and tty was altering the color on the fly via per map cell
via display code
expand glyphs to uniquely represent things that are at the top of a pile of
objects (piletops); some window ports were already doing that on the
fly via a glyphmap flag, but NetHack itself had no awareness beyond
setting the glyphmap flag within the display code
expand glyphs to uniquely represent male and female variations of monsters,
pets, ridden monsters, detected monsters and the statues of monsters;
tile interfaces were already mapping them uniquely via a glyphmap flag
and mapping to separate tiles within the window port code, but NetHack
itself had very little awareness beyond setting the glyphmap flag
within the display code
added glyph_to_body_corpsenm(glyph) and glyph_to_statue_corpsenm(glyph)
macros to display.h for use by pager.c; the game core code is better
off using such display macros/functions for all glyph_to_* mappings
that are needed, rather than resorting to direct references of glyph
offsets that could change as the set of glyphs expands or gets adjusted
map_glyphinfo() now simply references an internal array that maps each unique
glyph to a color, a ttychar, or a tile, also to a set of glyphflags
that confirm some unique characteristics of that glyph; the glyph
mappings are set at game init/restore after config file processing, and
are reset upon level change, or when some game options are adjusted
in-game that could have an impact on the mappings, but they remain
stable between those events
added MG_MALE glyphflag to complement the MG_FEMALE glyphflag that was there