NHDT-Branch: NetHack-5.0 $:$NHDT-Revision: 1.1649 $ $NHDT-Date: 1777000050 2026/04/23 19:07:30 $ 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 #6 first footnote, insert omitted "be", 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', #9, fix name typo "Noddy" -> "Nobby" 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", #12, fix name typo, "Vines" -> "Vimes" The Truth #1, italicize several words Thief of Time #2, "gold starts" -> "gold stars" A Hat Full of Sky passage #9 "though" -> "thought" Death quotes #29, "metaphore" -> "metaphor" 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 make vrocks emit a poison cloud when they flee 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 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' prevent searching or waiting if hero is slimed, stoning, strangled, or deadly ill if safe_wait is on - override with 'm' allow random mimics to show up mimicking 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 noticeable if " 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" wishing for werecreature figurine always made one that created the monster in beast form if activated; allow "human were" 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 redundant "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 " expires" rather than " 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 targeted 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 " venom" to "splash of 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 behavior; 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 restful sleep gives a warning message few turns before you fall asleep 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 cockatrice 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 -> 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 possession 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") 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 targeting 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 into -" produced a scrambled message: You mime dip 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 , while {paralyzed|frozen} by " into "killed by , 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) when picking up a stackable item, it can be identified by comparing it to another identical item that is already identified 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 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 adjustments: 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 report cause of death due to touch of death as "killed by the touch of death inflicted by " instead of just "killed by a touch of death" report cause of death due to wand/spell/breath as "killed by zapped/cast/exhaled by " instead of just "killed by " 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 always drain max energy 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 " 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 perm_invent: over-reading a spellbook so that in faded to blank didn't update persistent inventory to show that if blank spellbook was already known 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 !" (hero moving) and "It was hidden under !" (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" 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 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 dwarvish cloaks somewhat protect hero's inventory from cold and fire 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 unvisited 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 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 proceed a little further into dochat() if hero is deaf stacks of 1 to 49 gold pieces weighed 0 the chance for #untrap to free a monster stuck in a web was very unlikely unless hero was poly'd into spider form; make it less hard if #untrap monst-from-web failure happened while hero was standing on a spot where a new web couldn't be created (furniture, grave, magic portal), the expected " remains entangled" feedback wasn't delivered if hero is wearing an amulet of magical breathing and polymorphs into a fish or sea monster, don't lose health for turns spent out of water fix up some "the" handling for monsters whose type name is upper case to avoid "Uruk-hai is healthy for a statue", "You can't polymorph into Oracle" controlled polymorph would turn hero into new man or woman if player asked to become a unique monster of the same race (so usually human) instead of being told that polymorphing into the specified form wasn't allowed assigning a fruit name that matches the name of an artifact which doesn't use any "the" prefix could yield messages showing "the Artifact" when dealing with the artifact rather than fruit: "You are blasted by _the_ Excalibur's power!"; didn't impact basic inventory formatting selection of random engravings, epitaphs, and hallucinatory monster names had the same problem that rumor selection used to have: entries which follow longer than average lines are most likely to be chosen and ones which follow shorter than average lines are least likely; use same workaround as for rumors: pad the shortest lines; result isn't uniform distribution but is better (tradeoff vs size; see makedefs) make selection of random rumors, engravings, epitaphs, and hallucinatory monst names have uniform distribution by handling long lines specially when filling a special room with monsters, if one that can come in groups got picked the group could spill to outside of the room extend 3.6.1 fix to explicitly use name of unseen shopkeeper instead of "It" in various shop related messages (ones issued outside of shk.c) fix some inconsistencies with applied bullwhip vs monster polymorphing while wearing an amulet of strangulation from a form that wasn't vulnerable to one that was gave wrong message ("still constricts") for accessibility reasons, give a message when monster teleports and when a monster is created during gameplay (for the cases that did not have their own custom message) if a gremlin stole intrinsic 'see invisible' the map wasn't updated properly mark some messages as urgent ("You die*.", having equipment stolen, being caught in a magical explosion) if a leashed pet changed name (#name m) or an unnamed pet changed type (polymorph or grow-up) and perm_invent was On, persistent inventory display didn't get updated to show the leash's changed information attack feedback when using a bullwhip said "swing"; change to "lash"; use "lash" for hero hitting with wet towel too attack feedback for monster using polearm when adjacent said "thrust"; change to "bash" apply runmode delay to multiturn actions, not just running if a giant carrying a boulder was on ice that melted, it could be killed twice, first by drowning, then by boulder filling the resulting pool when it dropped inventory before being removed from the map allow fire-command to automatically use a polearm, if wielding it make '$' command also count gold carried inside containers fleeing leprechauns bury their gold after teleporting allow #tipping container contents directly into another container when one leg is wounded, have ^X report which (already used plural if both) wand of probing used on steed ('z >') didn't include wounded leg(s) feedback getting wounded in one leg when the other was already wounded miraculously healed old leg and kept longer of their recovery timeouts for new one when parsing config file entry "BINDINGS=key1:cmd1,key2:cmd2,key3:cmd3" allow keyN to be either a naked comma or backslash+comma instead requiring that comma's numeric value be used to bind comma to a command when two or more shops share a wall and hero uses Passes_walls to carry an unpaid item from inside a shop into the shared wall, it could yield impossible "unpaid_cost: object wasn't on any bill" when examining inventory if the shop code picked wrong shopkeeper to determine cost when two or more shops share a wall and hero uses Passes_walls to carry an unpaid item through the shared wall into another shop, theft of that unpaid item from the first shop wasn't noticed redo the unpaid_cost fix to handle shop items inside hero-owned container flyers shouldn't fall on arrival when going down holes or trap doors change movement keys and some special keys into extended commands "WHAMMM!!!" feedback when kicking a door suggests noise so if hero is deaf an alternate message should be given fix typo in message shown when hero sees a monster's wet towel become drier for hero with slippery fingers, enlightenment reports "slippery fingers" or "slippery gloves" but self-probing described it as "slippery hands" when hitting with wet towel causes it to lose some wetness, defer "your towel dries" until after the hit message do some extra damage when hitting an iron golem with a wet towel when already at level 30 and gaining another level--which doesn't increase level further but does add more HP and Pw--throttle the increases don't stop running when next to a peaceful, unless it blocks the way mindless monsters shouldn't cringe stepping on squeaky boards falling down a hole or trapdoor will cause damage proportional to fall height stinking gas clouds block line-of-sight covetous monsters will teleport to downstairs or upstairs to heal have fake player monsters use verbalize instead of pline when reacting to chat fix mention_walls distinguishing unseen walls from solid stone don't push unknown boulders when moving in flush_screen, reorder the code slightly to complete the bot() and timebot() calls prior to the window port call to place the cursor on the hero magic traps can toggle intrinsic invisibility Death attacking a monster does drain life attack add unique Rider revival messages don't dereference NULL u.ustuck in dobuzz() when hero has been swallowed monsters should growl even if you can't hear it give a sound effect message when thrown item lands in water or lava don't show rusting of items that land in water the water used on the Plane of Water stops thrown or kicked items looting will do #force if you could do it and the container is locked and you didn't have a tool to unlock it use silly names for rays (such as breath weapons) when hallucinating zombies groan instead of being silent martial arts users, sasquatches, and heroes wearing kicking boots can no longer miss a monster completely with a clumsy kick knights get no caitiff penalty against undead candy bars are bright blue in text mode towels weigh more than blindfolds knight quest home level contains some saddled warhorses allow creating unhidden traps in special levels reading magic marker shows the specific red ink color imps and other creatures cussing hero wake up nearby monsters make ravens oviparous thrown items can get stuck in webs engraving with Fire Brand burns the text on the floor and does not dull the artifact make looting less tedious by getting rid of a y/n prompt making the command go directly into the loot-in-out -menu always give a message when monster changes form via polytrap if seen illiterate hero receiving a spellbook from their deity gets the spell shoved directly into their mind instead adjust levels of sleep, confuse monster, and charm monster spells replace monk starting sleep spell with confuse monster chargeable rings have a chance of getting charged when hit with electricity flint and hard gems break less often when thrown hobbits getting a sling also get some ammo for it elves and rangers get alignment penalty for cutting down trees casting a forgotten spell uses some random amount of power heroes starting with a spell have at least one level one spell, and have just enough power to cast it huge monsters and pit fiends get easily out of pits give a message when a trapped monster frees itself from some trap change kitchen sink glyph to a white { killed wood golem has a chance to also drop small shields, clubs, elven spears, and boomerangs discovering an object on first turn with persistent inventory enabled might not update inventory info for that item (autopickup a blank scroll or spellbook and read it as first action; it becomes discovered but will still be shown as if undiscovered until next inventory update) most traps now require touching the floor to trigger if a lit potion of oil on the floor was launched by an explosion and it hit and killed the hero via missile damage rather than its own explosion, it could trigger an "obj_is_local" panic when end of game cleanup tried to extinguish it as a light source place_object() validated coordinates after using them to index level.objects killed rope golem may drop leashes, bullwhips, and grappling hooks killed leather golem may drop leather cloaks, and saddles using magic portals stuns hero for a few turns using level teleporters confuses hero without teleport control for a few turns clear obj->bypass for buried objects [a giant on ice triggers a fire trap, inventory is subjected to burning and surviving objects have their bypass bit set, giant is killed by fire trap and drops a boulder and other inventory, ice is melted, boulder plugs resulting pool burying rest of giant's dropped inventory, subsequent sanity checks report that there are buried objects which are 'flagged bypass'] give Sunsword as starting gear only to lawful Angels; since Demonbane has become a mace and Angels only get swords, they won't start with it for #knownclass with menustyle=Traditional, allow player to ask for `a even if no artifacts have been discovered yet, same as `; likewise for `u to ask to see unique items reduce eucalyptus leaf nutrition to 1 life-saving might increase max HP; if level drain triggers that, don't let max HP go up because it confuses healing for monster wielding Stormbringer HP recovery and/or max HP boost from eating royal jelly didn't perform a status update to show the change if poly'd hero is hiding under food and eats or #offers that food, stop hiding hide-under monsters who can be turned to stone aren't able to hide under a cockatrice corpse unless there is something else present but make sure that the other items aren't all more cockatrice corpses don't stop travel when going past a closed door (eg. when traveling along a room wall) some monster corpses can now convey temporary acid or stoning resistance fix travel getting stuck oscillating between two locations kicking a trapped chest and getting the exploding chest result destroyed items at the hero's location rather than the chest's location; because of that it left the exploded chest intact it was possible to destroy a Rider corpse with an exploding chest when teleporting, don't consider pits/spiked pits/trap doors/holes as unsafe destination locations if hero is levitating or flying try to avoid locations with engraved Elbereth or scare monster scroll when creating new monsters or picking teleport destinations for monsters who are susceptible to those be more flexible when wishing checks for artifact name matches; now allows "firebrand" or "fire-brand" to yield "Fire Brand" exclude unique monsters from pacification when untrapped from web ask to kick a door open, if it's locked and you don't have unlocking tool give a message when stinking cloud is created on top of hero when being life-saved prevents the hero from moving again during current turn, avoid logfile annotation "while helpless" if hero dies a second time if drinking from a fountain randomly gave the 'detect monsters' effect but there were no monsters on the level then there was no feedback object detection always showed a mimic imitating a statue as a tengu even if it had information available about some other type of monster avoid "the Lord Surtur's corpse glows iridescently" when shk_your() or the() is applied to the corpse of unique monster with a personal name restoring while attached ball or chain is on floor in a breach of a shop wall could have it be moved out of wall gap as that gets repaired, then might trigger an impossible about being positioned too far from hero don't try to catch up for lost time for shop damage repair in restdamage() called from getlev(); let normal shopkeeper movement take care of it shop wall repair that was delayed because the hero or a monster was an obstacle in the gap at repair time might not be displayed as wall once the obstacle moved and the repair eventually took place putting objects into a container with menustyle=traditional and then taking them back out with #tip would result in complaints about obj bypass bit being set if sanity_check was On when drinking or dipping, allow the 'm' prefix to be used to skip asking about fountains and pools calling real or fake Amulet something could give away information about them throwing gold while inside a purple worm would yield "The gold disappears in the the purple worm's entrails." (note doubled "the") inventory #adjust for !fixinv, after picking 'from' slot the prompt for 'to' slot was supposed to include the next letter beyond those in use as a candidate for destination but an off by 1 error only showed a-x where x is last letter used (despite that, y could still be picked) with two-weapon combat or Cleaver attacking multiple targets, hero kept going with next attack after being paralyzed by passive counter-attack trap detection could falsely find trapped secret doors; those can't be trapped due to details of how they use overlaid fields in the rm structure for force-fight against edge of level, report "you harmlessly attack unknown obstacle" rather than "you have moved as far as possible" using wizard mode ^V in endgame to return to previously visited Plane of Water now gets the same air bubbles back instead of a replacement set; likewise for clouds on Plane of Air on tty at least, "version incompatibility for save/123xyzzy" was invisible: a blank message of appropriate length followed by --More-- fix a pair of off-by-one bugs when doling out initial characteristics points, resulting in an unintentional bias toward Str and away from Cha; negligible effect on individual games but had a minor cumulative effect across a large set of games using a marker to write "novel" or "paperback book" on a known blank spellbook was producing a randomly chosen Pratchett novel; make it fail instead when a monster killed a pudding and it left a glob, that glob might not be displayed on the map (wasn't an issue for killed-by-hero case) if player gave a subset count when removing an item from a container, then got the pickup_burden prompt and declined to continue, the item remained split rather be recombined, making it possible to create multiple stacks of gold inside a container two-handed weapon message stated "welds to monster's hand" instead of "welds to monster's hands" when formatting an object, avoid capitalization of "The" in " named The " be less specific when cause of death is "handling a " that happened to be silver for current game; list it as "a silver ring" or "a silver wand" rather than "ring of searching" or "wand of locking" adjust the row placement of copyright and early startup messages so that aren't partially overwritten by prompts that follow ball and chain could be accessed after having been freed if bones were saved early post-3.4.3 tried to fix the "naming artifacts trick" which could be used to distinguish the type of some undiscovered items, but using a name that only matched an artifact after capitalization was exploitable the u.ustuck hierarchy is: swallowed by ustuck, hero poly'd into sticky form is holding ustuck even if ustuck is sticky, ustuck is holding hero; but some code assumed that the first two cases were reversed and could make formerly sticky pold'd hero clear ustuck, leaving hero swallowed by nothing (u.uswallow==1 with u.ustuck==NULL); that could cause a crash if u.ustuck got dereferenced when a vampire gains levels and grows into a vampire lord, change its cham field (shapechanger base type) from vampire to vampire lord so that if it revives in base form it won't revert to plain vampire a migrating long worm that couldn't arrive could be placed at <0,0> while setting up another migration attempt to the level, triggering impossible "trying to place long worm tail at <0,0> mstate:8 on level" (message is confused; it should say "long worm" without tail) dropping things with 'D' wouldn't merge them with compatible items already at that floor spot because use of obj->bypass made them seem incompatible a hero on the quest home level who runs or travels past the quest leader and gets tossed out of the quest for some reason would keep running on the far side of the quest portal allow rush/run over water if wearing discovered water walking boots putting on water walking boots while underwater (maybe via magical breathing) and rising to surface wasn't causing the boots to become discovered flying pets wouldn't target underwater food but if they happened to fly over such food they could and would eat it praying on an altar with pet corpse or statue on it can revive the pet applying a cursed oil lamp can make your hands slippery valkyries start with a spear instead of a long sword grid bugs don't have hands if #wizmakemap was used to generate a replacement level while any shopkeeper, temple priest, or vault guard from the level was off of it at the time, the monster's eshk, epri, or egd data became invalid and would cause trouble if the monster returned to its 'home' level similarly, if #wizfliplevel was used to transpose an active level while a vauld guard was maintaining a temporary corridor or while a monster with eshk, epri, or egd data was off level, that data became invalid blessed potion of polymorph will prompt user for monster to poly into out of array bounds access attempt occurred when deciding whether to bounce if wand or spell zap reached edge of map if blind hero was challenged by a vault guard, it wasn't possible to see how to start following that guard out of the vault make taming via magic harp be consistent with scroll of taming and charm spell: an angry shopkeeper becomes pacified (but never tamed) wielding a bec de corbin makes ravens generate peaceful moving with 'm' prefix allows hero to enter a known pit carefully rangers always succeed in disarming bear traps, unless impaired bigroom variant 2 may have ice floor in unlit areas bigroom variant 3 may have some walls replaced with other terrain bigroom variant 4 may have two large squares of terrain in the middle bigroom variant 5 may have patches of ice or clouds some large monsters can knock back smaller monsters with a hit change Demonbane to a silver mace, make it the first sac gift for priests, and give it an invoke ability to banish demons wielding Giantslayer prevents knockback from larger monsters; likewise for carried loadstone(s) scared hostile monster which cannot move away will attack prevent a fog cloud that has engulfed the hero from moving under closed doors allow cutting a known spider web with wielded weapon by force-fighting the web holes and trapdoors have a fixed exit level recent changes to losedogs() could result in an infinite loop when migrating monsters try to arrive as hero moves to a different level when invisible without see invisible you could see your hands glowing red after reading a scroll of confuse monster and delivering melee hits greased saddle makes it impossible to mount the steed if an item-using monster zaps a wand of digging downward on a level that doesn't allow holes but does allow pits, create a pit and trigger it no longer override the effect of a new moon by simply carrying a lizard corpse make explosions burn monster's armor just like they do hero's armor make healing and extra healing better by upping the average amount healed lifesaving healing amount depends on the constitution hitting a monster with a wielded potion hits you far less pyrolisks get a mundane bite attack chances of random item being an artifact depends on already existing artifacts monsters can zap wands of teleportation at hero piranhas devour corpses turn on menucolors boolean automatically if any menucolors are defined blind hero was notified when brass lantern burned out even though it isn't warm enough to detect that by touch; manually switching the lantern on or off can be determined that way so still gives on/off message turn on statushilites automatically if any are defined change poison instakill to damage with attribute and max hp loss trappers and lurkers above enfold themselves around and crush their victims, not swallow and digest attempting to move up or down when poly'd into a holder and holding a monster rejected the move; release the monster instead throwing a non-weapon while engulfed by an ochre jelly reported that the item vanished into the jelly's "currents" if a pet gelatinous cube eats a container, treat it the same as when a hostile one does: the container is destroyed but its contents are engulfed when breaking a wand of sleep hits the hero with the explosion, don't describe that as "the sleep ray hits you" expose fuzz tester to wizard-mode as #debugfuzzer extended command monsters which cannot move due to boulders or walls try to escape intelligent monsters see and remember when others trigger traps random figurines are of harder monsters by 5..10 difficulty points statues for statue traps are of harder monsters too, but only by 3..6 monsters can blind you with a camera lit candles generated by wishing could have wrong light radius better feedback from detect unseen make public server admin messages use urgent_pline cannot kick while squeezed on top of a boulder room stocking would put multiple items on the same spot splitting a stack of named, shop-owned objects while perm_invent is enabled produced impossible "unpaid_cost: object wasn't on any bill." more consistent feedback if a reviving corpse becomes an unseen monster improve consistency between applying a key and explicitly opening a door: if in a pit, you're told "you can't" and no time elapses; if there isn't any door in the direction supplied, you're told "no door" and time elapses if you discover the non-door's terrain type but doesn't if you already knew the type there if a bones file contained a doppelganger imitating a unique monster, a game that loaded those bones would end up with that monster counted as having already been created so it wouldn't be created when the time for that arrived (the doppelganger would change its shape normally, not be stuck in the unique monster's form) if Vlad was lured to a level which allowed bones, he could be present in a bones file for that level if he was in wolf/bat/cloud form at the time hero died; getting those bones in another game would flag him as extinct; if that occurred before entering his level he would not be created there, leaving no way for hero to acquire the Candelabrum when mounted hero got hit by an explosion, hero and steed shared resistances removing an engraving from frost (ie, written with fingers on ice) reported "you wipe out the message that was written in the _dust_" orc hero starts with poison resistance but orc monsters lacked that orc hero has maximum 18/50 strength but hero poly'd into an orc got 18/100 hero with exceptional strength (18/01..18/100) retained that when polymorphed into any monster lacking the strongmonst attribute give hero poly'd into a giant 19 strength instead of 18/100 wait for a response after displaying wishing help; affects X11 guardian nagas' constriction attack could never hit because the two preceding attacks must both hit and those were mutually exclusive: bite and spit explicitly throwing 1 for non-gold stack of more than 1 and then canceling at direction prompt left a pair of stacks of 1 and N-1 with same invlet some attack damage which shouldn't affect shades operated as intended when hero could see it happen but erroneously affected them when not seen phrasing of the "you can't" message when attempting to name any monster defined with a unique name or title sounded strange when rejecting to remove the existing name without assigning a new one some instances of using up or stealing shop-owned boulder didn't charge for it when hero hears an unseen monster reading a scroll, only describe the monster accurately if hero is not hallucinating and monster is same species as hero's current form don't allow monsters to disarm hero with bullwhip if hero is engulfed teleporting an object out of a shop put it on the shop bill instead of dealing with robbery map browsing during gold detection didn't describe fake gold marking traps when detection was via cursed scroll if hero's action caused engulfer to expel swallowed hero, it might do so onto a level teleporter and then have its memory accessed after being freed when current level was saved in order to load destination level throwing recoil while levitating could send hero out of shop while carrying unpaid items, triggering sanity check warnings; once outside, taking a step other than back into the shop was treated as a robbery if punished and iron ball was cursed and wielded--so welded to hand--falling when doors would drop it instead of keeping it welded if player's run-time config file had OPTIONS=role:Val and the environment had NETHACKOPTIONS='role:!Val' the hero would be a Val instead of !Val sleeping or unconscious hero attacked by Medusa would meet her gaze if a trap killed both the hero's steed and the hero an impossible "dmonsfree: N+1 removed doesn't match N pending" warning could occur prevent paralyzed hero from helping nymph or succubus remove worn armor when identifying items via menu and more than one pass is needed (so when identifying 3 items and player only picks 1, for instance), issue --More-- because the next menu might cover up the ID message(s) slightly more interesting Gehennom filler levels don't reveal color of potions, gems, or spellbooks that haven't been seen up close (seeing faraway monster operate on an object counts as up close) fix freeing a worn object when forced to drop it by falling down stairs allow setting per-level "temperature": hot, cold, or temperate, currently only affects some messages digging is noisy polymorphing into fire elemental allows you eat flammable items hitting sleeping monsters will cause them to wake up noisily demon gating happens more in Gehennom and less outside it intelligent peacefuls avoid digging shop or temple walls fix bug making random subrooms never touching the right or bottom wall of the parent room if a grave is created with the corpse lying on top (bones), don't find a corpse or release a zombie or mummy when digging it up kicking a headstone might summon a ghoul eating garlic makes nearby monsters flee giants occasionally get a battle axe or a two-handed sword give gremlin the property it stole, if possible 'F'orcefighting with a war hammer has a small chance of breaking iron bars player assigned name for monsters, specific objects, or object types could be longer than what was intended to be allowed; for 'curses', much longer very rarely random items are generated eroded, erodeproof, or greased Nazgul can see invisible fix a case where punished iron ball yanked hero on top of a monster slightly randomize amount of items and monsters in the mines dying in a wall spot (temporary gap or via Passes_walls) shared by two shops could result in "place_object: \"\" [0] off map <0,0>" warnings a monster capable of using a polymorph trap to deliberately change form could do so when trapped in an adjacent web or pit; if that happened, the monster remained flagged as 'trapped' and wouldn't be able to move give feedback when some types of damage are avoided due to MC (aka negation) feedback if a named, shape-shifted vampire reverted to original shape rather than dying when engulfed could say "Dracula turns into Dracula" adjust archeologist and valkyrie starting intrinsics spell of knock can knock back small monsters protection from shape changers now prevents the Wizard from mimicking monsters having worn levitation boots removed and destroyed (scroll, monster spell, dragon breath) and floating down into lava can destroy them twice; yielded "object lost" panic if program had been built with a debugging malloc implementation which overwrites the contents of freed memory ensure that all window interfaces respect flags.silent (suppress terminal beep) falling into lava, being life-saved, and teleporting out could yield redundant descriptions of what was present at hero's new location if hero had passes-walls capability and was at the location of a closed door, attempting to use 'o' on own spot reported "you don't find anything here to loot"; change to open door for '.' (or '<'), only loot for '>' items thrown by monster landing on an altar did not show BUC flash a chameleon in giant form who gets trapped (bear trap?) while carrying boulders and changes shape could be killed when dropping them; shape-change traversal of its inventory would continue after it dropped everything, possibly resulting in a crash if hero is engulfed and polymorphs into a monster form which is too big to be engulfed, make engulfer expel the poly'd hero give feedback if monster holding onto the hero has to let go when hero polys into a form which can't be held prevent hug attacks and touch or engulf attacks for wrap, stick-to, and digestion damage from succeeding against unsolid targets (ghosts, vortices, a few others) or against worm tails wand of speed gives temporary speed, potion gives intrinsic some monsters (riders, shopkeepers, priests, quest leader) can break boulders if hero owes shop for a boulder and shopkeeper breaks it, continue to bill hero for the boulder rather than switching to the resulting rocks corpse-eating monsters will go out of their way to eat corpses on the floor warnings via impossible() would be unseen if message suppression via ESC at --More-- prompt was in effect wearing the Eyes of the Overworld overrides OPTIONS:blind; breaking the always-blind conduct by doing that was intended but having permanent blindness stay cured after removing them was not change helm of brilliance from iron to crystal so that it no longer needs to be a special case for metallic armor vs spell casting fake player monsters in endgame had a 1 in 1000 chance to be given a stack of 0 gold pieces, eventually triggering an impossible warning (cited one was "Calculating weight of 0 gold pieces?") avoid "wall_angle: unknown hwall mode 4" when using #terrain command to display a spot remembered as a wall but actually a secret door that has been transformed into an open door while not in sight it was possible to produce a web at a water or lava location; it would not be visible but could trap the hero, resulting in drowning or incineration engraving in an open doorway was allowed, engraving in closed one (presumably via Passes_walls) was not, but closing the door on an engraving was; change to allow engraving at closed door location engraving in a breach in a shop's or vault's wall or vault guard's temporary corridor would leave the engraving intact after repair/cleanup if a fire resistant non-fire immune monster wearing a thoroughly burnt wooden shield got knocked into lava, burning the shield completely yielded impossible warning "obfree: deleting worn obj" hangup in wizard or explore mode would result in answering ESC to "Die?" prompt if that was reached, and since default is 'no' the hero would be life-saved and the game would try to keep going; if circumstances resulted in repeat death then the program might get stuck in a loop instead of exiting [no reports of such, but if it ever happened the process was probably killed without anyone knowing why it happened] with OPTIONS=blind (blind from birth), being inflicted with timed blinding yielded "your vision seems to dim for a moment but is normal now" avoid sanity_check warning if statue in water or lava gets polymorphed into a boulder; break it into a stack of rocks if that would happen werewolf or werejackal howling and purple worm burping wakes up monsters don't exclude map column 1 from consideration when rloc() picks a random spot for destination of a teleported monster covetous monster attacking another monster to acquire special item would not do so if positioned diagonally adjacent skip sanity_check handling when current command is ^P, otherwise it might re-trigger and show new sanity warning every time when set for line-at-a-line feedback applying a cream pie (always) or lump of royal jelly (sometimes) would use up the object and then access its memory after that had been freed keep track of hero's pending movement points across save and restore give feedback if hero sees a monster become hidden under an object or water hero might hear unseen monster read scroll of create monster or scroll of teleportation; when it was create monster, player was given a chance to call it something but not when it was teleportation, allowing the player to deduce which type of scroll it actually was wizard mode wish for terrain while on a fountain|sink spot made the counter for number of fountains|sinks become one too big; would affect level sound messages if all fountains|sinks were eventually destroyed add a level arrival region to the Gnome King's Wine Cellar variation of the Mines' End level so that hero can't end up in the treasure chamber make potion of water become discovered if dipping a carried container into an uncursed one reports that water gets inside or slides right off a monster which was temporarily asleep wouldn't be affected by taming (either food or magic), but one that was indefinitely asleep would be; when tamable via food, it even caught and ate the food without waking up in wizard mode, #terrain has offers to view all map locations as single- letter codes corresponding to the levl[][].typ numbers and to view a legend showing letter-to-type correspondence; adding new type "lava wall" didn't update that legend and misdescribed all the types which have higher values restore the ability for trap creation via magic which creates pits to destroy 'furniture' allow #sit while flying over a squeaky board trap to trigger it weight of statues of wraiths and of monsters which never leave a corpse was 0 when a werecreature in human form attacked hero, it could transform to critter despite hero having the Protection_from_shape_changers_attribute status highlighting for hit points didn't work as intended for up or down HP changes; 'up' rule was used for both, 'down' rule was ignored unhide an unseen water monster using a polymorph trap on land allow defining random-teleport or monster-generation exclusion zones in lua if Magicbane cancelled a shapeshifter, forcing it to 'unshift', subsequent messages continued to refer to the shifted form a pet that was poison resistant but not stoning resistant would eat Medusa's corpse and be turned to stone ring of hunger prevents choking on your food paranoid_confirm:pray can be changed to require yes/no response instead of y/n by also setting paranoid_confirm:Confirm wand of probing reveals map locations and traps in the ray path; also reveals secret doors and secret corridors if the ray hits such wand of probing zapped downward while hero is over water shows items under that wand of probing reveals tin and egg contents applying a wielded, lit potion of oil to unlight it while other unlit potion(s) of oil were quivered would trigger panic "addinv: null obj after quiver merge otyp=N" where N is POT_OIL casting stone-to-flesh at self turned wielded or quivered rocks into unwielded, unquivered meatballs, merging stacks if there were some in each slot the throne room on the Samurai quest home level lacked a throne but gave "You enter an opulent throne room!" message the first time it was entered; vary the message rather than add a throne coughing due to stinking cloud wakes up nearby monsters stop occupation when timed levitation or choking issues a message use #monster to make dragon steed breathe steam vortices and fog clouds leave steam clouds behind fog clouds maintain any clouds they are in, even poisonous ones bone devils summon skeletons adjust wand of make invisible and potion of invisibility effects barbed devils have an attack that sticks you to them balrogs prefer bullwhip if hero is wielding a weapon ice devils have an additional attack, a slowing touch buff scroll of confuse monster and blessed potion of monster detection if a temple was entered while blind, #overview could show a line of just "." when describing altars if no other interesting features on that level were known rolling boulders ignored walls and trees shopkeepers consider the monster type when charging for tins, eggs and corpses separate level flags premapped and sokoban hero had worn amulet of magical breathing become unworn during theft by nymph, dropped it to be able to crawl out of water, so it wasn't there when game tried to transfer it to thief, triggering an "object lost" panic digging down on a magical trap causes it to explode thrown potion of sickness now bypasses target's innate magic resistance but only affects current hit points, no longer also reducing maximum HP lightning has a small chance of melting iron bars make spell menu work with repeat when attempting to look up a named fruit in data.base, try harder set and check mon->mstate flags more consistently fix sanity error when cloud was created over an engraving docall naming of the monster that currently has the hero swallowed by using their visible interior give missiles thrown or shot by monsters the same chance to get used up upon hitting as when thrown or shot by the hero change menu_headings to also accept a color or color&attribute issue feedback for encumbrance more consistently during pickup up if hero destroys an altar by breaking a wand of digging or applying a drum of earthquake, provoke divine wrath if hero destroys a shop wall by breaking a wand of digging or applying a drum of earthquake, have shopkeeper demand payment mimics sometimes woke up and came out of hiding when they shouldn't have if hero without protection from shape changers returned to a previously visited level (though they would usually rehide so it wasn't obvious) Wizards no longer have a bonus to writing unknown spellbooks, but now learn what spellbooks look like as they gain skill in their spell schools (allowing a guaranteed write with enough skill) starting inventory: magic markers are more likely (guaranteed for Wizards), but have fewer charges early dungeon (pre-Sokoban) generates extra useful survivability items potion of healing is much more common, and has a unique price alchemy may affect only a portion of the dipped potions if a large stack is dipped (especially if that stack is diluted) monster kills can no longer deathdrop comestibles (other than the monster's corpse) unless the monster collects food or generates with food about 10% of the heroes will now be left-handed; track the handedness of the hero in the 'you' struct if a monster fled from hero by intentionally jumping into a vault teleporter, it would teleport randomly instead of into the vault, and if the teleport trap's niche wasn't mapped yet, the trap would become mapped but the spot would remain a secret corridor and not become accessible boomerang travels in a clockwise arc when thrown by a left-handed hero and in a counterclockwise arc when thrown by a right-handed hero spellbooks weight 50 units but Book of the Dead only 20, and novels only 1; the Book of the Dead has been changed to 50 and novels to 10 save and restore hero tracks, increase track length change vrock and hezrou from red to green, adjust vrock tile to have green change wolf and werewolf to grey, warg to black change [master] mind flayer, the Wizard, and the riders to bright magenta change Nalzok and Minion of Huhetotl to bright red walking into a shopkeeper tries to pay the bill show billed items in a menu when paying with non-traditional menustyle prioritize paying shopkeeper next to you even if multiple are detected avoid impossible "trapped without a trap (fmon)" from 'sanity_check' when a drum of earthquake made a pit at a monster's spot and pit creation caused adjacent pool/moat/lava to flood that spot; if a non-floater, non-flyer monster survived that, it got marked as trapped even though flooding deleted the trap demons cannot be frightened by showing them their reflection HP regeneration formula has changed, primarily to be less fast in the endgame riding negates stealth unless the steed is flying previous hero rising as undead in bones retains intrinsics level temperature affects monster generation amulet of unchanging cannot be polymorphed wishing for a "lit candle" provided one, but the feedback as it was added into invent was "partly used candle (lit)" because of how 'lit' timer works don't fall off steed because of Fumbling if saddle is cursed cursed welded quarterstaff doesn't prevent spellcasting wielded quarterstaff gives a small spellcasting bonus if polymorphing a potion turned it into oil, dipping potions produced oil randomly, or a horn of plenty produced a magic potion and converted it into oil, the resulting potion of oil had its age (amount left) set of the original potion's age (turn it was created) and could burn for an arbitrarily long time if applied; conversely, polymorphing oil into non-oil kept its relative age (no noticeable effect though) an engulfer capable of passing through iron bars could do so even when hero was engulfed some uses of mons[obj->corpsenm] weren't excluding obj->corpsenm==NON_PM (-1) if a covetous monster tried to teleport next to the hero but the level was completely full, it would be booted off the level (set to migrate back if the hero left and returned) instead of just staying put if loadstone was unIDed but had been assigned a type name and you failed to pick one up, the message referred to it as "gray stone" rather than "stone called " when a vision blocking gas cloud dissipated, the screen didn't necessarily get updated to show newly visible locations in a timely fashion if confused #loot while on a throne moved whole stack of quivered gold into 'coffers' chest, the gold wasn't unworn from quiver slot, potentially leading to crash when quiver was subsequently accessed when filling quiver slot, don't bother asking "what do you want to ready?" if invent is empty no secret doors or corridors on the first two dungeon levels the number of items destroyed by elemental effects is based on the damage randomize the spellbook in the second level of vlad's tower monsters weren't randomly generating if exactly one square was outside LOS, and it contained a monster when a spellbook was polymorphed into a novel and then incrementing spestudied field turned it into a blank spellbook, the novel's title would stick: "{spellbook of blank paper|plain spellbook} named " walking on ice can make you slide in a random direction if an adjacent statue was a in a pit, you could break it with a pick-axe even though you're conceptually at the wrong elevation to reach it using '#adjust c c' to collect all invent items compatible with the one in slot c prefixed the inventory update message with "Merging:" rather than "Collecting:" if there was at least one compatible stack; when there weren't any compatible stacks and it was effectively a no-op, the prefix used was "Collecting", lacking its intended colon using '#adjust c d' or '#adjust d c' after splitting slot c via '#adjust Nc d' for N less than c's stack size swapped c and d instead of re-merging them even though merging was the intended behavior (the 3.6 change that caused this was intended to avoid collecting other compatible stacks while still merging the two specified ones) ring of aggravate monster increases the level difficulty if hero shattered an unseen monster's weapon, the [also unseen] weapon was described in the feedback don't self-genocide if a monk picks "master-lich" or "masterlich" as target (was matching "Master" rank) Sunsword can be invoked to create a blinding ray Excalibur is much harder to get if hero is not a knight pets considered any noise made by hero made as whistling silent monsters in stinking clouds don't cough unblind telepathy range depends on number of telepathy granting items worn gold thrown or kicked at a sleeping monster with the 'greedy' attribute gets caught instead of being treated as an attack but the catch message neglected to report that target monster was awakened in the process hero movement affects the water bubble movement direction pets and peacefuls avoid a location hero just kicked pets avoid a possible boulder pushing location in sokoban shopkeepers bill you for using their bear trap or land mine when engraving with a stack of eligible weapons, split one off the stack and dull it rather than dull the whole stack when engraving with a stack of cursed weapons, treat it differently if that stack is welded to hero's hand: write in dust and leave whole stack welded rather than split one off stack to engrave on floor hero or monster didn't fall into pit if water at the location was boiled away shopkeepers magnified the cost of shop items used up as a group; normally using an item splits 1 from its stack, but applying a stack of N candles to light them all charged N * N * single_candle_price the tile for Ixoth (knight's quest nemesis) depicted a demon rather than a dragon; change it to be a red dragon untrapping containers or doors gives some experience only honor DEBUGFILES (for activating debugpline() calls) when in wizard mode if hero is on scroll of scare monster or Elbereth, werecreature switching from human to beast form or general monster polymorphing into a susceptible form will become scared right away instead on its next move 'altmeta' option didn't work as intended when 'number_pad' was On; typing "n ESC c" wasn't treated as "n M-c" because reading the 'n' changed program_state.input_state from commandInp to otherInp, preventing special ESC handling; not an issue when number_pad was Off a 3.6 fix to avoid a potential "object lost" panic when drinking potions had unintended side-effect of making used up potions on shop's bill become separate bill entries all with count 1 despite having come from same unpaid stack; affected Ix inventory listing and itemized shop billing buying shop items which include any unpaid ones inside containers would reveal them even when the containers hadn't been opened (obj->cknown==0); recent change to pay via menu made the problem become more visible; shopping has been changed such that buying anything that is inside a container requires that the whole container be bought as a unit using #loot -> 'i'n to put multiple items into a shop-owned container would ask whether to sell each item to the shop, and was prepared to accept 'a' to sell the current one plus all the rest beyond it, or to accept 'q' to not sell the current one or any beyond it, but the sell vs don't-sell state was being reset for each item so 'a' and 'q' didn't stick beyond the current one join wall "spines" with walls of water and lava some theft messages by nymphs force "she", others use default monster naming which yields "it" when unseen; change the latter to "someone" which still differs from "she" in a series of messages but isn't as jarring if a nymph stole worn armor and got killed (perhaps by pet) before hero's next turn, feedback would be "You finish taking off your suit." regardless of the type of armor being taken off when setting an option interactively [via O or 5.0's mO], if the particular option uses a prompt to get a line of input (for compounds: 'fruit', 'scores', most numeric ones), input was treated as a comma-separated list of option[:value] rather than just the new value of that option when there was a trap on a no-dig level, the floor beneath it was always "too hard to dig into", making it impossible to remove the trap the #terrain command didn't know how to cope with visible gas/cloud regions; treat as traps as far as player choice of whether to show or hide; if/when a spot contains both region and trap, show the trap region expiration reported "the gas cloud around you dissipates" even when the hero was swallowed region expiration could report "the gas cloud around you dissipates" and also "you see a gas cloud dissipate" for the same cloud spot reduce shopkeeper's innate speed from 18 to 16 so that a hasted shopkeeper doesn't always get 2 moves per turn when a secret corridor was discovered by wand of secret door detection or by wizard mode ^E and converted into a regular corridor, if there was a formerly embedded object at the spot, presence of the object would be forgotten unless within range of a light source when poly'd into a giant, kicking a closed door always succeeds in breaking it reduce crystal plate mail weight interactively setting a status highlight for hunger with 'O' and choosing 'text match' could crash while setting up the menu of hunger status value strings; happened for curses or if the program was built to use C++ regex processing but not for tty+posixregex a pet with the hides-under attribute could "move reluctantly over" a cursed object and then hide under it prevent monster generation in the sokoban trap hallway change MSGHANDLER from compile-time to sysconf option allow changing extended command autocompletions via #optionsfull if eating a tin's contents caused the hero to choke to death or turn to stone, resulting bones would contain the tin still intact when hero who is poly'd into metallivore form eats a tin, bypass "smells like " feedback and the "Eat it?" prompt; just eat the contents along with the tin without asking digging in ice was handled inconsistently, particularly if done at the span spot in front of closed drawbridge angry god may remove an intrinsic gelatinous cubes eat organic objects inside them pets with reflection were unwilling to attack floating eyes artifact gifts are rebalanced (easier to obtain; higher-value sacrifices are needed for higher-value artifacts; lower-value artifacts are usually gifted enchanted; unaligned artifacts are possible but rare even on the first gift; artifacts you can't use well are less likely) luck gains from sacrificing are limited by the value of the sacrifice failed #untrap could move hero diagonally into or out of an open doorway remember box is trapped after finding the trap when you hear a monster incant a scroll, ensure that the 'I' invisible monster indicator doesn't trump telepathy briefly proceed with showpaths option even if the sysconf file is missing angry shopkeeper was not charging for thrown items avoid "You fall down a deep shaft!" if deliberately flying down since introduction in 3.1.0, the definition for Mitre of Holiness has specified that carrying it provides fire resistance, but that had never been implemented; wearing it didn't confer fire resistance either--there is no 'defends' capability for it since carrying should encompass that if a tree and a boulder or statue were at the same location, applying an axe would break the boulder or statue rather than chop the tree avoid premapping outside Sokoban map to prevent showing stone glyphs Grimtooth is permanently poisoned, protects from poison, and can fling poison invoke cost for Grimtooth and Sunsword can be paid with magic power cursed magic whistle can teleport you to your pet Fire and Frost Brand can be invoked for expert level fireball or cone of cold wielding Trollsbane grants hungerless regeneration hitting with Ogresmasher gives a higher chance of knockback Snickersnee can hit at a distance once per turn for free the engraving pristine text field was not being appropriately populated during level creation worn alchemy smock reduces chances of dipped potions exploding dwarves can sense buried items under their feet monsters trapped in pits cannot kick create familiar spell can create harder creatures a vampire lord could choose to take on wolf form while flying over water or lava, then revert to vampire lord form and teleport unnecessarily a gas spore that was killed when an engulfer swallowed it produced an explosion on the map rather than inside the engulfer hallucination can display objects on the map that have a description (for shuffling into play at game start) but no name; examining those might trigger a crash some food and paper items do no damage when bashing improved messages for oilskin sacks protecting from water damage some messages by amorous demons and mail daemon were delivered as verbal ones even when the hero is deaf travel couldn't find the vibrating square if it was covered by an object or a monster; it isn't really a trap so treat it as special terrain travel would stop one step in front of known vibrating square like other traps fix bug which delayed burden changes due to monster actions (e.g. reverting to natural form due to damage, changing carry capacity) for one turn on arboreal levels (Ranger quest) where STONE terrain is treated as TREE, an object at a tree location would be described as "embedded in stone" an item at an ordinary tree location, whether the level is arboreal or not, would be described as itself with no mention of the tree some types of shopkeeper now start with a scroll of charging objects are now accurately tracked as discovered even if not type-named nor formally identified (fixing some bugs in scroll writing, and making the discoveries list more accurate) you cannot sacrifice objects/corpses while stunned or confused 'whatis' actions // and /? didn't work when the lootabc option was on, they required /a and /c instead; add '/' and '?' as group accelerators so that they work; /y and /n for them now only work when lootabc is off writing on an unidentified scroll of blank paper identifies blank paper dumplogs include spells and skills praying will not restore monster-form HP while polymorphed, unless you have unchanging winter wolf cub was missing for monster to lycanthrope conversion monster elves shooting arrows weren't getting intended small to-hit and damage bonuses luck has a reduced effect on to-hit chance monsters use wand of teleportation to move hero away from item pile lycanthrope instincts keep hero from changing shape while next to hostiles scroll of enchant armor formula has changed (in particular, magical armor now gains less enchantment when enchanted than nonmagical armor and uncursed scrolls can sometimes enchant by more than one point) dragonhide can rot throwing ammo without a launcher produces a message polymorphing into a large polyform unequips rather than destroying cloaks clarify in the #quit message that it doesn't save the game cursed potion of invisibility removes intrinsic invisibility fix bug which caused engulf damage from air elementals and fog clouds to ignore damage reduction from armor class elementals do double damage on their home plane water elementals move slightly more slowly the "totally digested" instadeath timer is much faster slow monster effects are more effective against faster enemies light-spell is clerical, if playing a priest boomerang can hit multiple monsters the "bustling town" minetown has more peacefuls healers may get tiny damage increase when attacking with knives allow rogues to also backstab sleeping or paralyzed monsters rogues cannot backstab monsters that have no backside give experience if opening Schroedinger's Box causes death of the cat inside priest donation amounts are explicitly stated, randomized slightly, based on peak rather than current level, and allow for bulk donations (buying larger amounts of clairvoyance/protection) if you have a lot of gold amulet of magical breathing increases power regeneration change some command keys, 'v' is now chronicle, 'V' is versionshort, m-prefix 'V' is longer version, remove key binding of #history one orc-town shaman has a higher level, affecting spellcasting hero has a small chance of catching items thrown at them wizard mode: history menu for #wizwish and WIZKIT monster priests and wizards did not cast spells prevent phaseable monsters hiding deep inside nondiggable walls blessed potion of see invisible does not guarantee the intrinsic prevent selecting all options in #optionsfull menu shapeshifters change shape less rolling boulder traps aren't removed when stepped on and move boulders pushed onto them when starting a new game as a monk, newsym(0,0) was being called (adjabil -> postadjabil -> see_monsters when initializing See_invisible as hero became level 1; seen 'monster' was the hero who hadn't been placed on the map yet) incorporate a fix to prevent segfault due to rolling boulder trap wands of digging generate less often lategame Fixes to 5.0.0-x General Problems Exposed Via git Repository ------------------------------------------------------------ incrementing EDITLEVEL to invalidate incompatible save files was not working as intended because VERSION_COMPATIBILITY was defined as 3.7.0-0 and up rather than as 3.7.0-N for the current EDITLEVEL 'N'; undefine it 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 format 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 teleportation'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 "" or for "" worked as intended but wishing for "" (where 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 macOS 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 'segment' at <0,some_y>, worm at 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 getobj refactor also allowed non-nameable items on floor to be assigned names exploiting the bug to assign type name to glob on floor allowed wishing for "N assigned-glob-name" to create a glob with quantity N instead of 1 fix ^X feedback when held typo: "unseen createure" -> "unseen creature" if a corpse was set to revive as a zombie and corpse was partly eaten at revival time and monster is defined as providing more nutrition that 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 targeting 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 incompatible 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" glob shrinkage while hero was away from glob's level wasn't handled properly unpaid shop-owned glob that shrank to nothing had weight 0 which triggered onbill warnings when 'sanity_check' was On; for 'Ix' and itemized billing, the empty weight was shown to player if 'wizweight' was On if 'showrace' was On and invisible hero couldn't see invisible so didn't see self, the color of whatever could be seen underneath changed to white in wizard mode, a poly'd priest/priestess attempting to polymorph into priest or priestess in order to rehumanize became a new man or woman instead because "priest" matched "aligned cleric" rather than the role monster if a glob which has just shrunk away to nothing was wielded or quivered, unwield it before destroying it after changes to gender tracking for corpses and statues, when a unique monster got turned into a statue if was erroneously flagged as female rather than 'historic' changing engraving to an occupation resulted in not dulling a weapon used to engrave a single character a change to wounded legs handling resulted in not recovering lost dexterity or receiving the "leg(s) feel better" message if wound time expired rather than having legs be explicitly healed turning movement into commands broke the rest_on_space option; it also interfered with using pick-axe plus autodig in downward direction cursed scroll of light had special message when wielding Sunsword that didn't work for wearing gold dragon scales/mail giving a prefix keystroke other than 'm' prior to a command that doesn't use prefixes was silently ignored instead of being rejected prior revision broke all prefix usage movement command revamp broke 'm>' and 'm<' on stairs to avoid auto-pickup at the destination when trapeffect_selector() returns 2 to caller mintrap(), meant to signify that the monster was killed in the trap, ensure that mintrap() returns that value too have com_pager() check for failed nhl_init(); probably can't actually happen because the program would never get that far if lua init was failing rearranging first-kill and first-hit gamelog messages to get hit before kill ordering resulted in "hit with a wielded weapon for first time" being given twice if that hit was delivered via applied polearm or via a joust hit rearranging the feedback for first-kill and first-hit introduced a bug by not verifying that the wielded item used to hit was a weapon, giving erroneous event feedback and potentially giving it over and over for other non-weapon hits for as long as never-hit conduct stayed unbroken counting "just picked up" items when deciding what pseudo-classes should be included for the 'I' command's object class prompt was operating on an uninitialized variable changes to stair internals resulted in summoned Kops blockading the stairs up rather than intended stairs down dumplog's list of "major events" showed all logged events, not just major ones pickup via menu ignored player-specified count when picking up gold changes in encumbrance sometimes went unreported, leaving stale status line info until hero's next move taking off yellow dragon scales/mail or having temporary stoning resistance time out while wielding a cockatrice corpse without gloves left that corpse safely wielded instead of petrifying the hero special level loading wasn't honoring gender specified in lua code add '#tip' for containers to context-sensitive invent handling sequencing confusion: picking an item when viewing inventory and picking an action to do with it caused the inventory command to use time, then on next turn the action was performed without taking any time program would access freed memory if charging caused a ring to explode arriving on Valkyrie quest final level could produce impossible warning "mkstairs: placing stairs up on molten lava at <68,13>" if the repeat command was used after prefix+command, only the command part got repeated the change for repeat after prefix+command would result in a crash if repeat was attempted after an unassigned key items obtained via wishing while blind were erroneously being marked as 'seen up close' so behaving differently from items picked up off the floor corpses of neuter monsters had random chance to be flagged as female so would only stack with others that made the same random choice one-shot food testing ability conferred by blessed scroll of food detection didn't warn about globs of green slime because the relevant code was only executed for corpses, eggs, and tins, not for globs worn ring of slow digestion blocks per-turn hunger but not the hunger caused by wearing it; white dragon scales/mail was blocking per-turn hunger and didn't cause any hunger itself; change to treat it like the ring if the program was built with EXTRA_SANITY_CHECKS enabled, changing levels while riding would give impossible warning "no monster to remove" the change to protect Rider corpses from being destroyed by exploding chests inadvertently prevented them from being used up when Riders revived force-fight against furniture covered by an object described the attack as missing an unknown obstacle using #wizmakemap on Plane of Water added a new set of air bubbles each time it was run and eventually replaced just about all the water; likewise with clouds on Plane of Air avoid new "where are we?" panic if player quits during character selection add Untrap as a potential 'autounlock' action if a zombie revived near the hero, a busy hero would keep doing whatever action was in progress instead of stopping because the zombify didn't walk across the threshold from no-threat to threat revised monster teleportation message handling caused magic whistle to be changed to not operate on pets that were already adjacent; change back revised monster teleportation message handling could produce duplicate message when shopkeeper who left shop got returned to it revised magic whistle produced message sequencing issues when summoned pet arrived on a trap, particularly if killed or sent away or shape changed recent changes in removing a dead monster from the map didn't update screen to show objects it dropped; they were present, just not displayed further changes resulted in dead monsters' corpses be placed at <0,0>; reverse the part(s) that cleared stale monst->mx,my adding name/rename choice to #therecmdmenu caused it to crash when picking an adjacent unnamed, untame monster for menustyle:Full, fix the combination of 'A' auto-pick all plus 'P' just picked up to limit what "all" means for menustyle:Traditional, fix 'P' for just picked up items in inventory when filtering what items to put into a container restrict stunning effect to is_xport trap types lua's garbage collection didn't like the way nethack was trying to use it and issued a pair of warnings each time the relevant code got run items flagged as just-picked-up were unflagged if you stepped on other items without picking anything up activating a magic portal still gave "you feel dizzy for a moment, but the sensation passes" after portal traversal was changed to make the hero be stunned for a few turns after the fix for zombie reviving near hero (which now interrupts hero's occupation), could get "revive panic" when eating a troll corpse if it revived on the same turn that eating the corpse would finish a wizard's starting equipment was supposed to include a random spellbook of spell level 1 through 3 but it was being forced to be level 1 earlier fix for prices of unpaid objects going away in persistent inventory display when hero bought something during itemized billing didn't work if paying for a used-up shop item--prices of any unpaid items vanished when inventory got updated to reflect transfer of hero's gold to shk save files created with SCORE_ON_BOTL disabled were erroneously being rejected if the program was rebuilt with it enabled and vice versa avoid "It suddenly appears!" if a monster with the STRAT_APPEARMSG attribute is seen to teleport away then not seen at its destination avoid boulder-on/in-water sanity_check warnings on the Plane of Water when one monster swallowed/engulfed another and killed it, impossible "placing over itself ..." could be given by place_monster() if the game crashed or the process was killed, recovering a save file ended up with incorrect stairway connections between levels when using --nethackrc=file on the command line (currently only implemented for ports that use unixmain.c), options parsing freed the string containing 'file' before using it as the RC file name using 'o'pen as a synonym for #loot of a container at the hero's location did not work if the hero was in a pit update '?' menu to reflect change to 'O' command end of game with DUMPLOG could panic due to perm_invent handling, even when the persistent inventory window wasn't in use with color Off and the screen symbol for ice the same as for floor, the black and white ice was supposed to be rendered in inverse video but that got broken by the symbols and glyphs overhaul command line processing interleaved with options file processing is complex: a recent change to make 'color' show up for tty in the short options menu resulted in 'nethack --windowtype:X11' running X11 with ascii map ('NETHACKOPTIONS=windowtype:X11 nethack' continued to default to tiles) when the Astral level got created, any fake player character monsters that were seen or sensed when created were reported as " suddenly appears!" rather than be treated as part of level's initial population tipping contents of one container directly into another allowed transferring wands of cancellation and bags of holding or tricks that were inside a sack, box, or chest into a bag of holding without blowing it up prevent random traps from being created inside the shops in the tourist quest if hero's steed got hit by knockback effect, impossible "no monster to remove" would occur (plus more warnings if 'sanity_check' was On) the #saveoptions command included options changed via doset_simple() but not ones changed via full doset() fix 'nethack --scores' as alias for 'nethack -s' adding command line 'nethack --usage' broke 'nethack -u name' (however, 'nethack -uname' still worked for names other than "sage") being hit by a big monster and getting knockback effect could send hero out of a shop (or into its "free spot") while carrying unpaid goods; robbery wasn't noticed until hero eventually moved to a different spot hallucination of objects incorrectly included generic objects as candidates for what objects looked like; if an object had its dknown flag set, formatting a generic object in its place was unreliable (Null pointer deference prior to static analyzer fix, odd fake name "generic" after) some actions that ask the user to pick a location allow typing '$' to show valid spots, accept typing a second '$' prior to moving the cursor to toggle the highlights off; ^R already did that; moving the cursor too change 'm' prefix for #tip from 'use menu to pick among floor containers' (since that's already the default) to 'skip floor containers' so that context-sensitive item-action Tip directly operates on the item anti-magic field's reduction of hero's maximum energy could result in current energy being one point higher than maximum if hero was killed by a wand zapped by a monster, cause of death was reported as "killed by a bolt of imagined by " throttle the difficulty of the monsters in theme room "buried zombies" buried troll whose auto-revive timer expired might trigger panic with "revive default case 6" throwing a helm of brilliance could yield "breaking odd object?" sanity checking of engravings was stopping after first problem found the fuzzer could get stuck in a loop if hero died in a way where life-saving just resulted in a repeat death (cited case was burning up in lava, where life-saving teleports you out of it; if the level is full, the teleport will fail and you'll immediately burn up again) fix unicorn horn's ability to repair blindness quest nemesis and a few other special monsters are suppressed from bones; their death feedback could be given when they were removed running the tutorial until completion and returning to normal play but left the 'no followers' flag set; adjacent pets wouldn't tag along when hero moved to other levels when a magic whistle moved a hidden pet it brought that out of hiding and gave a message about "your appears" but the map was updated while it was still hidden so nothing seemed to appear entering the tutorial stashed hero's equipment for eventual return to normal play but going down stairs to the second tutorial level returned it too soon and allowed any items gathered on the first level to be kept entering the tutorial disables the Save command; exiting it is supposed to re-enable that but the change to fix the second level broke that entering the tutorial and then returning to play made the tutorial branch be eligible for a portal destination via wizard's Eye of the Aethiopica 'hard helmet' was based on being metallic so overlooked crystal helmet don't blame/credit hero for stinking cloud if dying quest nemesis releases one Lua selection operations 'subtract' and 'xor' didn't always work as intended accept 'true' or 'false' as value for des.object field 'trapped' special level loader didn't check for bad coordinates supplied by .lua file thoroughly enough hero might not be credited with "entered Mine Town" achievement for the town variations which treat the whole level as the town if that level gets entered via falling or level teleport in the theme room "water-surrounded vault", guarantee an item which can be used to escape from the room in one of the four chests pets capable of using items would pick up and wear cursed armor if something breakable was set up as alternate weapon and the second of two bare-handed hits succeeded, it would be broken and trigger impossible "objfree: deleting worn obj" strength cap for hero poly'd into an orc captain was 18/50 even though it is 10/100 for Uruk-Hai and monster Uruk-Hai can grow into orc captains status_hilite rule for critical-hp takes precedence over up/down/changed HP livelog/#chronicle of multiple high priests reported their deaths as "killed high priest" and "killed high priest (2nd time)" instead of "killed high priest of Foo" and "killed high priest of Bar" using wizard mode #wizkill outside the endgame followed by m^V to enter the endgame without any intervening moves would result in impossible "dmonsfree: 0 removed doesn't match N pending on " dwarf/elf/orc/gnome hero killed by zombie would rise as human zombie for bones paranoid_confirm:Autoall for menustyle:full has the test handling backward and was treating 'yes' as no and 'n' or ESC as 'y' applying a wielded lump of royal jelly but not picking something to rub it on while other lumps of jelly were quivered would trigger a panic, "addinv: null obj after quiver merge" (like applying lit potion of oil) ceiling hider could become hidden when there was no ceiling, triggering a warning if sanity_check was On hero could be forced onto a monster's location if a level was full and an engulfer was occupying an adjacent but inaccessible spot, engulfed hero, then expelled hero while now occupying hero's accessible spot, triggering sanity_check warning "you over monster" experimental #saveoptions wasn't saving the set of cond_xyz options correctly; if player viewed the 'm O' submenu for status conditions, they would get saved even if not changed; otherwise, ones that came in from the old RC file wouldn't be included in the new one knockback or recoil while levitating could hurtle the hero through a wall of water to the spot beyond unless it happened on the Plane of Water if recoil from throwing an item while levitating sent hero into a wall of water, the thrown item got placed in that water rather than at its intended destination include '-' as suggested item in "what to dip?" prompt if dipping at pool or fountain or sink with slippery hands don't attempt a second hit for bare handed/martial arts if wearing a shield when using 'm #overview' to annotate a level other than current the one, include level number, and dungeon branch if not current one, in the prompt instead of generic "this level" when using 'm #overview' in the endgame, don't include non-endgame levels when a tethered aklys gets caught in a web, make sure it doesn't return and that the display of the tether gets cleaned up add 'X' as a potential context-sensitive item-action for uwep and uswapwep monsters weren't noticing hero's possession or lack of magic resistance when hero getting zapped by a wand of striking was or wasn't resisted discard monsters' observations about hero's resistances when saving bones autopickup while levitating shares code with 'mention_decor'; after being told about ice covered by an object, moving over some other object later when mention_decor is Off could give "you are back on solid ground" long after leaving the ice duration of temporary stoning resistance would be extended while eating a cockatrice corpse, as intended, but not while eating Medusa's corpse so if it timed out during the meal, player got the message about hero no longer being protected against stoning but was able to finish the meal safely farlook at something that was on top of an engraving or grave would report the engraving text or headstone epitaph along with the 'something' when carrying 52 items (excluding gold), hero couldn't pick up a thrown, stolen, or dropped item which was split off from a still-carried stack supply chests on early levels weighed the same as empty chests until something was added or removed stacked pair of potions of healing in supply chest weighed same as one potion; drinking one of the two gave a healing message, then both had their weight updated as their stack was split; if close to an encumbrance threshold, new weight would trigger an encumbrance increase message, immediately followed a decrease message when the potion got used up bounds checking for object name formatting inadvertently introduced a change that hid BUC prefix for charged rings debug fuzzer was triggering out of bounds array access in loseexp() if life-saving at level 1 used blessed restore ability to regain lost levels and restored those all the way to level 30; introducing an assert(u.ulevel < MAXULEV) changed bounds issue to assertion failure strength less than 25 was unintentionally being capped at 18/07 if an amulet of flying got stolen while hero was over lava without other protection against lava, it would be destroyed even though it's not flammable, then attempting to format it for messages would trigger an impossible warning about "glorkum", then a crash occurred poison gas breath from green dragon or iron golem that hit and was reflected left target enveloped in a gas cloud (reflection now takes precedence; somewhat odd though: gas that misses still leaves target enveloped) Warning didn't show nearby monsters who were inside poison gas/steam/smoke regions map didn't show adjacent monsters if they were inside a gas region unless they were seen via telepathy or extended monster detection, but they were described as if visible in messages (combat, for instance) OPTIONS=symset:blank and symset:plain didn't load the specified symbols if used from the RC file or NETHACKOPTIONS for OPTIONS=symset:blank, S_engroom (engraving on a room floor spot) and S_engrcorr (engraving on a corridor spot) retained their default symbols ('`' and '#', respectively) instead of switching to space setting perm_invent in RC file before setting windowtype (whether later in that file or via NETHACKOPTIONS) could result in it staying False depending upon whether the default windowtype supported it if hero was wielding potion(s) of unholy water and a magic trap gave its remove curse effect, scroll of remove curse would become discovered object discoveries during the tutorial carried over when normal play resumed; counts of monsters created and vanquished carried over too end-of-game attribute disclosure in wizard mode reported incorrect text for for apron/alchemy smock's conferral of poison+acid resistances (3.6.x was susceptible to this for T-shirt text but since T-shirts don't confer any attributes, it wasn't noticeable) if a tame or peaceful monster was trapped and blind hero hadn't seen the trap yet, attempting to swap places would report "You stop. can't move out of that trap." and if the 'tips' option was On, #untrap would be suggested; but #untrap would fail due "you know of no traps there" camera flash hitting a hidden mimic mentioned it as being a mimic but didn't bring it out of hiding when chain lightning hit a sleeping monster, the victim didn't wake up on medusa-4, Medusa and the downstairs were located in different chambers on medusa-3 and medusa-4, Perseus's statue was located in a different chamber from Medusa omit "a" from "drowned in a limitless water" when drowning on Plane of Water restoring a save file could trigger impossible "rnd(0) attempted" if it tried to make an unhidden mimic hide as an object; if the code was marked as a released version, it would crash due to divide by 0 error instead fix regression of a post-3.6 fix: if 2 Wizards of Yendor were in play and 1 escaped the dungeon, bookkeeping for current number of Wizards stayed at 2, interfering with future Wizard behavior sometimes a repeat count from the preceding command carried over to most recent one when using do-again (^A); if the most recent one was an extended command, the spurious repeat was for '#' if peaceful monsters react when seeing hero attack a peaceful monster, don't have quest guardians run away; also, quest leader only becomes angry if the monster being attacked is a quest guardian farlook of water/lava location listed wall of lava before molten lava; because of that, lava was omitted ("molten" suppressed to reduce vebosity, resulting in "lava" which got skipped as substring of "wall of lava") having #terrain display gas cloud regions as if they were traps didn't work for monsters in such regions that are shown when adjacent to hero or sensed via ESP when a monster within a gas cloud was displayed on the map because the hero was next to it, it remained displayed if hero moved away eating a pyrolisk egg on the floor triggered an "object lost" panic core object creation and the curses interface's window handling both became confused by the 'pauper' option/conduct because they assumed that invent being Null meant that the game hadn't started yet wizards were discovering unread spellbooks whenever any skill was advanced; do so only when a spell skill is advanced if tips were enabled, the getpos/farlook tip clobbered the initial prompt (at least for tty's one line message window), so reissue the prompt after the tip has been displayed a post-3.6 change to try to cope with invalid light source data when restoring corrupted save file caused "panic: relink_light_sources" for valid save file if saved while hero was poly'd into a light emitting monster priestname() didn't handle "a" vs" "an" prefix correctly; normally priests are named as "the priest of " but hearing an unseen priest read a scroll doesn't force "the" and yielded "You hear an priest of incant ." non-fireproof water walking boots wouldn't be burnt up if fire resistant hero walked on molten lava 1x1 poison gas clouds for green dragon and iron golem breath could be placed at wall locations if a pile of objects had plain arrow(s) on top, map location classification got confused and reported 'unexplored area' when the 'fireassist' option was on, 'f' would choose uquiver over wielded throw-and-return uwep knockback could move hero diagonally into or out of an open doorway farlook of /e or /E stopped reporting engraving and headstone text after a fix for the situation where // or ; reported such text when there was an object or monster in the way message was garbled when lightning or acid breath hit iron bars shop bug: buying a container with unpaid items in it could produce impossible "unpaid_cost: object not on any bill" warnings when walking into/against a locked closed door, 'autounlock'==kick didn't execute kick when player answered yes to "Door is locked. Kick it?" having a 1% chance of creating rideable monsters with worn saddle gave knights a 1% chance of creating an extra saddle for starting pony; it wasn't tracked with other objects so produced a trivial memory leak when attacking a displacer beast, using the 'F' forcefight prefix prevented it from swapping places with the hero successfully disarming a chest trap was clearing the chest's 'tknown' bit instead of setting it; likewise when failing to disarm triggered and used up the trap when game ended with 'force_invmenu' On, final disclosure of inventory would contain spurious menu entry "? - (list likely candidates)" avoid reporting "a gold pieces appears next to you" for mimic don't try to split a pudding that got jousted into a hole and is off the map mounted hero was able to deliver joust hits when trapped timer sanity check for melting ice gave false complaint about non-ice for frozen moat under open drawbridge mhitm_ad_phys() was not applying Half_physical_damage when hero was target callers of thitu() were not applying Half_physical_damage either throwing crystal plate mail or helm of brilliance up against the ceiling could result in the item being cracked and then vanishing yn_function (used all over the place) sometimes triggered an impossible() during do-again (^A) processing [ongoing revisions; more are probably needed; listed here in case ^A behavior changes] uncursed genocide while hallucinating deliberately mis-reports hero's role as target but was also inappropriately showing it to livelog/#chronicle livelog/#chronicle for bribing a demon lord reported random monster and currency if hero was hallucinating naming a type of item, unnaming it (with name of ), naming it again (new name or re-use of old one), then unnaming it again would issue impossible: "named object not in disco" throwing entire quiver and then picking the stack back up was not putting it back into quiver when reading a T-shirt or apron, add trailing period to the slogan unless already present in the quoted text when reading an engraving, suppress the addition of a trailing period if the text already has one cursed magic whistle could teleport hero on no-teleport levels give a brief explanation when receiving a wish for acquiring the Amulet teleportation traps no longer teleport you on levels made temporarily no-teleport by the presence of a monster an attempt to pick up an object from a monster's stomach would trigger an impossible() in newsym() due to object having no ox,oy coordinates set; set the coordinates to the monster's at the start of pick_obj() Fixes to 5.0.0-x Platform and/or Interface Problems Exposed Via git Repository ------------------------------------------------------------------------------ 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 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 curses: messages were tagged by turn in 3.6.x so that ^P can place a separator between groups of messages; somehow the line of code that recorded the turn vanished so ^P behaved as if every message came on its own distinct turn, resulting in lots of "---" separators curses: when entering a count while in a menu, cursor would jump to the spot on screen where the hero was, even if menu covered that part of map; post-3.6--started when curses was changed to use core's get_count() curses: clipped map crashed due to uninitialized memory curses: changes for tty's TTY_PERM_INVENT resulted in viewing inventory under curses while carrying only gold to crash; didn't matter if perm_invent was On or if TTY_PERM_INVENT was enabled curses: for screen refresh, don't attempt to refresh windows that haven't been set up yet or have already been shut down curses: for raw_print() in #if PDCURSES config, don't attempt to write to message window if it isn't set up yet or has already been shut down curses: scrollbar 'framecolor' wasn't being initialized before use causing an asan crash because the value is used to index an array curses: typing ESC to cancel something issued a beep; if the terminal was set to 'visible bell', the screen flashed; only beep when the ESC is part of an escape sequence--other than M-c generating ESC c--and nethack is expecting text rather than a command or direction curses: with window borders on and align_status:left, restoring brought up a screen where the message window's border wasn't shown; once it needed to be scrolled to fit a new message, the border appeared curses: after changing curses_mark_synch() to do something, making a menu selection by entering a count that uses more than 1 digit caused the menu to vanish curses: setting up default roguesymset at startup clobbered primary symset if config file picked Enhanced1 for primary (core bug exposed by curses) 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 Qt: changes in glyph handling in the core introduced a bug in the "paper doll" display for inventory subset Qt: during role selection, icons for role and race showed giant ant tile after the glyph overhaul changes Qt: resolve a use-after-free error when saving message history Qt: with a pick-one menu containing a pre-selected entry, clicking on that worked to re-select it, as intended; clicking on any other entry instead of typing the selector letter toggled off preselected entry but failed to toggle on the explicitly selected one; clicking again after nothing was pre-selected anymore refused to toggle anything on Qt: don't show main window and tombstone window maximized by default tty: redraw unexplored locations as S_unexplored rather than 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 tty: for #wizidentify, using ^I as an unseen group accelerator to pick the 'all' choice was incorrectly checking menuitem_invert_test() and failing, so the 'all' choice wasn't being toggled on if user typed ^I tty: changes to support utf8 resulted in lines of text windows being shown starting at their second character tty: changes to support TTY_PERM_INVENT resulted in blank inventory menu when using the 'i' command while carrying only gold; didn't matter whether or not TTY_PERM_INVENT was enabled during build tty: for the !DEF_PAGER configuration, redraw screen properly if attempting to display a file fails and tty_display_file()'s caller requests feedback for that situation tty: if a group accelerator matched a menu command ('^' in menu for '/') it wouldn't work to select, just to manipulate the menu tty: after resize changes which included screen erasure changes, ^C and yes|y to "Really quit?" while a menu was open would lead to a panic tty: make cursor visible again when using ! or ^Z to temporarily leave nethack Unix: after lua changes to Makefiles, 'make spotless' for dat subdirectory left some generated data files which should have been deleted Unix: reject "--sX" on command line except if "X" is "cores" (so "--scores"); single dash form still accepts "-sX" to lookup scores for "X" 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 Windows: original fix for GLYPH_UNEXPLORED background tile merging resulted in a new issue where the map wasn't being cleared on level changes Windows: don't dupstr the return value of setlocale if it is NULL Windows: nethackw.exe calculated vertical spacing for menu items based on the height of the tileset in use, even though the tiles in the menu were drawn at the default height of 16 anyway; get rid of the extraneous vertical spacing between menu rows X11: fix build failure if STATUS_HILITES is disabled 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: if a group accelerator matched a menu command ('^' in menu for '/') it wouldn't work to select, just to manipulate the menu X11: ascii_map could try to use a color value, with some added flag bits set, as an index into the color_gcs[] and inv_color_gcs[] arrays leading to a segfault; clear the flag bits before using the color as an index X11+macOS: 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 curses: was failing to honor menu_xxx option settings for menu interaction curses: make extended command prompt behave more sensibly curses: if a menu of objects contains at least one iron ball, and player is not already in the midst of entering a count, recognize '0' as a group accelerator rather than the start of a count curses: obey timed_delay option curses: support tty-style extended role/race/&c selection at start of new game curses: implement mark_synch() and wait_synch() curses: only convert arrow keys to hjkl or 4286 if nethack wants a direction curses: conversion of arrows and other numpad-related function keys to digit ignored phone-layout setting (inverted up/down) of the num_pad option curses: ensure alt+'A' through alt+'Z' and alt+'a' through alt+'z' work correctly with PDCURSES curses: fix an off-by-one error when deciding whether a long line on the bottom line of the message window can fit ">>" (curses' "--More--") curses: selecting a partial stack, unselecting it, and then selecting it normally did not reset the quantity to the whole stack curses: if user's terminal was set to 'application keypad mode' (DEC VTxxx nomenclature; set via 2 char "ESC =") and the terminfo or termcap entry told the terminal to send 8-bit escape sequences (via 3 char "ESC SPC G"), nethack wasn't recognizing number pad keys curses: change petattr attributes, dropping support for curses-only ones curses: swap the grey and no-color color initialization curses+tty+Qt: allow changing default colors with the 'palette' config option (only if compiled with CHANGE_COLOR) curses: if messages have been issued during start-up (for instance, warnings about issues in run-time config file), prompt user to press so that they can be read before curses erases the screen curses: when the map was narrower than the space set aside for it, wide popup windows could write into the unused space and whatever was written there would stick after the popup was removed documentation: when building plain text Guidebook.txt from Guidebook.mn, avoid attempting to use CR font; change doesn't affect building Guidebook.ps which utilizes CR to get various instances of fixed-width text documentation: improve Guidebook *roff formatting and prepare for use of future release of groff 1.24.0 (pr #1280 by g-branden-robinson) 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 MS-DOS: add -DSTATUES_LOOK_LIKE_MONSTERS to Makefile1.cross so the VESA mode can display statue glyphs MS-DOS: sample config file had same MENUCOLOR flaw as Windows (see below) MS-DOS: implement inverse text attribute 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 (aka ) in addition to 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 but 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: if player's run-time options specified a tiles file and it couldn't be loaded, Qt was falling back to x11tiles just like when the default can't be loaded; fallback to player's file plus explicit path instead Qt: force the 'toptenwin' option On so that high scores display at end of game is shown in a text window instead of being written to stdout where it might not be seen (note: doesn't apply to 'nethack -s') Qt: during role/race/&c selection, update role titles with their icons, and also Valk eligibility, when gender is toggled Qt: if a menu of objects contains at least one iron ball, and player is not already in the midst of entering a count, recognize '0' as a group accelerator rather than the start of a count Qt: {maybe just Qt+macOS:} 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 , the text window got pushed underneath the main window so seemed to go away Qt: use idPressed signal instead of buttonPressed and mappedString instead of mapped for recent Qt (pr #913 by chasonr) Qt: make all NetHack menu and text windows modal Qt: support Unicode supplementary characters (pr #1047 by chasonr) Qt: qt_tilewidth and qt_tileheight are allocated with alloc() and need to be freed with free(); don't use qt_tilewidth and qt_tileheight after they have been freed; instead, retrieve the size from the glyphs object (pr #1049 by chasonr) Qt+macOS: fix control key (fixed all except for ^V); handle ^V as a shortcut Qt+macOS: 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+macOS: prevent game->Quit-without-saving from being hijacked for the nethack menu by renaming it game->_Quit-without-saving (macOS only) Qt+macOS: add a separate nethack->Quit menu entry with different functionality; Command+Q invokes it Qt+macOS: 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+macOS: suppress unwanted "Search [______]" action from being inserted as the first entry in the menubar's "Help" dropdown menu sound: add a soundlib interface that consists of a specification documented in doc/sound.txt; default 'nosound' soundlib implementation of the specification in src/sounds.c sound: added 'macsound' soundlib implementation for use on macOS; the interface implementation resides in the objective C file sound/macsound/macsound.m; built on top of the built-in AppKit NSSound, #import , linked using -framework AppKit. sound: added 'windsound' soundlib implementation for use on Windows; the interface implementation resides in the file sound/windsound/windsound.c; built on top of the win32 api, header file mmsystem.h, linked with winmm. sound: add 'qtsound' soundlib implementation for use on any platform with Qt; the interface implementation resides win/Qt/qt_bind.cpp; built on top of Qt. 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 tty: if a menu used full screen and brought up another menu that wasn't full screen, sometimes only a small border of background was drawn around it with most of the map left blank until after the menu was dismissed tty: have dismiss pick-none menus instead of acting like '>' (not only wouldn't dismiss when not on last page, wouldn't dismiss at all) tty: menu search via ':' would clobber part of the menu with a status line refresh if the menu was tall enough to cover that tty: add support for petattr tty: if a ^C interrupt occurred while DECgraphics characters were being drawn on the map, the "Really quit?" prompt would be illegible due to being rendered with VT line drawing characters tty: hide cursor unless waiting for user input; now extended to include tty platforms that define NO_TERMS, rather than just on those using termcap/terminfo, namely Windows console and msdos (text-mode implemented; vga and vesa just have stubs currently) tty+curses: if terminal goes away while in the wishing prompt, return to the wish prompt when game is restored 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 Unix: work-around a build issue in ubuntu 21.10 by using ifdef to skip the define of warn_unused_result to empty string in tradstdc.h whenever __linux__ is defined during build unless GCC_URWARN is also defined Unix: re-do command line parsing Unix: add ../include/nhlua.h to the alloc.o dependencies in Makefile.utl to match Makefile.src Unix: implement SELF_RECOVER compile-time option, on by default on linux Unix: allow build to succeed with musl (instead of glibc), by specifying musl=1 on the make command line Unix: support tilde expansion for home directory path, "~/relative-path", in command line --nethackrc=path and environment NETHACKOPTIONS=@path 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 Windows: When there was no interesting background in get_bk_glyph() in display.c, a default value of GLYPH_UNEXPLORED was returned to the caller and then passed on to the interface; the graphical Windows version, NetHackW.exe, was trying to use the tile mapped to GLYPH_UNEXPLORED as a background tile to merge with the foreground tile, so check for GLYPH_UNEXPLORED and bypass that Windows: fix range error detected by address sanitizer in plselInitDialog() Windows: the .nethackrc template contained a sample MENUCOLOR pattern for "cursed .* (being worn)" which didn't work; parentheses need quotes 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+macOS): if persistent inventory was displayed at time of end-of-game prompting, prompting would stall until that window was manually dismissed X11: (possibly X11+macOS): try harder to resize the getlin() prompt, if needed, when prompt text changes X11: set all selectable menu lines to the same length, left justified X11: initializing the get-extended-command widget modified memory beyond what it dynamically allocated 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, walls, and (melting) ice 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 environment variables THEMERM and THEMERMFILL can be used in wizard mode to provide some control over theme room generation extended achievement and conduct fields for xlogfile record amount of gold in hero's possession in xlogfile new objects: amulets of flying and guarding, helm of caution, 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 or 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] 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, five to Night Watch, four to The Wee Free Men, four to Monstrous Regiment, two to A Hat Full of Sky 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 variants, a boulder maze, hexagons, pillars 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 decaying globs of {ooze,pudding,slime} shrink over time based on their total weight, eventually to nothing; for combined globs it can take a long time, and while doing so they no longer give the tainted corpse food poisoning effect when eaten track peak maximum HP and peak maximum energy/power; no noticeable effect give some dragon armor extra effects when worn issue messages during last stage of food poisoning/terminal illness countdown when hero's demise is imminent drinking blessed potion of full healing heals wounded legs, either hero's or steed's (when riding, wounded leg injury applies to steed, not hero) drinking uncursed potion of full healing or blessed potion of extra healing heal hero's wounded legs when not riding; no effect on steed if riding cancellation explodes most magical traps reading a blessed scroll of light has a chance to improve bless/curse state of wielded Sunsword or worn gold dragon scales/mail similar to dipping those into holy water; cursed scroll has chance to worsen the state added a chronicle of major events, and optional live logging of those paranoid_confirm:swim to prevent accidental dunking into dangerous liquids; joins paranoid_confirm:pray as the default setting paranoid_confirm:trap to confirm entering a known trap unless it is harmless; like revised paranoid_confirm:pray, requires y/n response; add paranoid_confirm:Confirm to require yes/no instead extend 'paranoid_confirm:trap' to request confirmation when entering visible gas cloud regions paranoid_confirm:Autoall to confirm picking 'A' in menustyle:Full filter menu looking at a monster will indicate whether it is asleep, and waking up a monster yields a message extend farlook's ", asleep" to ", can't move (paralyzed or sleeping or busy)" for timed sleep and also ", meditating" for monster that is waiting for hero to approach add body part terminology for spiders; enhance it for cockatrices context sensitive item usage menu from inventory, aka "item actions" pets are more likely to follow you closely if you are carrying something they really like to eat; behave as if you are carrying such whenever you are standing on stairs so that pets will try harder to come to you allow setting msgtype in SOUND line display detected door traps and chest traps as trapped doors and trapped chests rather than as fake bear traps if built with DEBUG enabled and running in wizard mode, starting play with DEBUGFILES=seethru in environment makes clouds on the Plane of Air, water on Plane of Water, and fumaroles on Plane of Fire be transparent add wizard mode #wizkill command to remove monster(s) from play some quest nemeses release a cloud of poisonous gas when they die taming magic acting on an already tame creature might make it become tamer eliminate scimitar skill and have scimitars use saber skill simplified configuration options menu rudimentary key rebinding in game options experimental #saveoptions command to allow saving configuration settings mouse buttons can be bound to extended commands hero poly'd into purple worm can gain intrinsics from digesting whole monster add some tins of spinach to monk's quest (vegan => no Str from giant corpses) very large humanoids can wear mummy wrappings for ranger characters, shooting any type of arrow while wielding the Longbow of Diana gets an extra +1 to multi-shot change the #vanquished command from debug-only to general user command add 'sortvanquished' option to be able to set the preferred sort order without using 'm #vanquished' and to have it persist across save/restore when sorting vanquished monsters by monster class, treat the Riders as a separate class from major demons add #genocided command have 'I u' mention whether there are any unpaid items on the floor (unusual but not impossible); it doesn't itemize them or show shop price add items given a Japanese name when playing as a Samurai to discoveries list make music improvisations more varied and interesting, as well as useful give a helpful tip when first entering "farlook" mode add a boolean option tips to disable all of the helpful tips add a tutorial level engravings appear on the map display; 'whatis' can list them ('/e', '/E') option to create the character deaf add conduct for petless preceding #overview with the 'm' prefix brings up the overview display as a menu allowing selection of any visited level to #annotate; it also shows every level visited rather than just the "interesting" ones include monster size in feedback for wand of probing and stethoscope crystal armor is now subject to cracking damage rather than outright breakage when a doppelganger takes on mplayer (fake hero) form, usually choose role from the high scores file; name too if visible at the time can now write unknown spellbook without need of Luck when spell is known; if spell becomes known without having read its book (potential divine gift), writing the book while the spell is still fresh will succeed new status highlight rule type for hitpoints: "criticalhp" rule overrides hit point rules if current HP is so low that prayer will consider it to be major problem; applies to hitpointbar as well as HP status high skill level in martial arts or bare-handed combat sometimes hits twice answering '?' at the "genocide what?" prompt (for either monster class or single species) runs the #genocided command to show what types of monsters have already been genocided and then re-prompts throwing the silver bell (or other invocation item, or the Amulet) to the quest leader will identify it instead of being treated as an attack applying gold pieces will flip one and report "heads" or "tails"; with a stack of more than one, normally the flipped coin will rejoin the stack during enlightenment and end-of-game disclosure, use contraction "n't" for " not" give feedback about the thaw status of ice terrain allow #dip '-' in a fountain, pool, or sink to clean slippery fingers/gloves allow #dip potions into a sink to get a hint about what they are, similar to dropping rings into a sink; dipping other stuff causes water damage so could be used to blank out scrolls and books when restoring, show current level's player-applied annotation if there is one have farlook of a grave report the engraving on the headstone if it's known the '*' command (list inventory items in use) now shows items in a specific order: amulet, ring on main hand (potentially affected by cursed one-handed weapon), ring on off hand, blindfold, wielded weapon, secondary or alternate weapon, quiver, suit, cloak, shield, helmet, gloves, boots, shirt, lit lamps and candles, leashes attached to pets, instead of by object class (sortpack) or inventory letter (!sortpack); new perm_invent+perminv_mode==inuse does the same allow the ')', '[', '(', '=', '"', and '*' commands to be preceded by the 'm' prefix to force a menu where the player can pick an item and choose a context-sensitive item action for it; some give a menu even without the prefix and for those, same item selection and action can be used hot ground (Gehennom / Plane of Fire) often destroys dropped potions erinyes overhaul; they now attempt to punish heroes who have violated their alignment and get stronger with greater alignment abuse accessibility options to tell where on map a message happened (accessiblemsg), to notify when a monster is spotted (spot_monsters), and when a monster moved (mon_movement), when hero takes damage (showdamage), when interesting map locations change (mention_map) accessibility command #lookaround which will describe what hero can see if hero is punished or tethered to a buried iron ball and has no inventory (or only carries gold or embedded dragon scales or both), a nymph might remove the chain when finding nothing else to steal 'showvers' option (and companion 'versinfo' option) to include program version in the status display so that it will be visible for screenshots or during streaming video 'query_menu' option to use a menu when asked certain yes/no questions pyrolisk eggs explode when broken pauper-option to start the character with no possessions wand of secret door detection, spell of detect unseen, and wizard mode ^E now flash the cursor at each location where detection finds something 'selectsaved' lists "name-role-race-gend-algn" instead of just "name" in the menu of save files available to be restored 'selectsaved' prefixes "name-role-race-gend-algn" with "- " for normal play, "X " for explore mode, or "D " for debug mode if any of the games shown in its menu weren't saved during normal play; if they're all normal play, the prefix is suppressed tourists gain experience by "taking photos" of new creatures, and going to new dungeon levels healers gain experience by healing pets blessed scroll of destroy armor asks which armor to destroy if wearing more than one armor; otherwise it'll destroy a cursed armor, or erodes random armor archeologists' fedora is lucky telepathic hero can discern which particular monster just read a scroll add "make fetch-docs" to download pre-formatted documentation monsters will use throw-and-return weapons such as an aklys archeologists can identify scrolls by deciphering their labels monster destroy armor -spell first erodes armor iron footwear protects the wearer against certain floor-based traps ring of stealth prevents hero from leaving tracks the game now automatically tracks which sell prices and buy prices you have seen for each type of item; these are visible in the discoveries list, and can also be shown elsewhere using the new 'price_quotes' option new shields: shield of shock resistance, shield of drain resistance new wand: wand of stasis early-game monsters always miss with their first use of an attack wand new command #toggle which can be used to toggle a boolean option 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 curses: if a message is marked urgent, override message suppression initiated by user having typed ESC at previous More>> prompt curses: implement a dialog for the windowborders option curses: implement the windowcolors option Qt: the "paper doll" inventory subset can be controlled via the "Qt Settings" dialog box ("Preferences..." on macOS) 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) Qt: add '#' as "Extended-commands" to the 'game' dropdown menu Qt: add tool tips to the extended command selector's buttons to show command descriptions Qt: add tool tips to the icons shown in the status window Qt: to play user sounds with volume, replace QSound with QSoundEffect; also restores user sound support for Qt6 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 tty: if a message is marked urgent, override message suppression initiated by user having typed ESC at previous --More-- prompt 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 Unix: support --nethackrc=filename on the command line; same effect as NETHACKOPTIONS='@filename' but leaves NETHACKOPTIONS available for specifying options; --no-nethackrc is same as --nethackrc=/dev/null Windows: implement MSGHANDLER (pr #749 by argrath) Windows: Add configuration to support Curses on WinGUI (pr #1028 by chasonr) 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 X11: fix map expose area, no longer leaving black bars on the map tty and curses: support italic as text attribute tty and curses: when hitpointbar is displayed, make it blink if current HP is below the "critical HP" threshold (where prayer treats being injured as major trouble) 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 Kestrel Gregorich-Trevor) 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 Kestrel Gregorich-Trevor) 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) bad cast making sp_lev chameleon light source (pr #625 by entrez) add Ray Chason's adaptation of nethack's Qt5 interface to work with Qt6 (issue #525 followup comment by chasonr) mingw32 build updates to replace contents of sys/windows/GNUmakefile and new sys/windows/GNUmakefile.depend (pr #661 by feiyunw) mark various pointers to const char as const pointers (pr #624 by argrath) function fill_special_room() in sp_lev.c was dereferencing a pointer argument prior to a subsequent check for a NULL pointer that resulted in an early function return (pr #669 by argrath) function repairable_damage() in shk.c was dereferencing a pointer argument prior to a subsequent check for a NULL pointer that resulted in an early function return (pr #671 by argrath) function savelev() in save.c was dereferencing a NHFILE pointer for nhfp->mode prior to a subsequent check for nhfp being NULL to trigger a call to panic() if it was; move the check for NULL above that usage (pr #675 by argrath) function tin_details() in eat.c was passing an obj pointer to tin_variety() where it was dereferenced; move the tin_details() NULL check above that tin_variety() call (pr #676 by argrath) remove unnecessary null checks from christen_orc() (pr #681 by argrath) mark high altars in altarmask (pr #748 by entrez) split kicking empty space into separate function (pr #754 by argrath) split adjusting attributes into separate function (pr #757 by argrath) split getting damages with a kick into separate function (pr #758 by argrath) split fixing curse trouble into separate function (pr #765 by argrath) Handle -eaux plurals in makeplural/makesingular (pr #767 by entrez) mdisplacem stoning and gloves had test backwards (pr #773 by entrez) writing type-named scrolls (pr #551 by entrez) more cases where newcham() gives messages (pr #775 by copperwater) lua: instance cleanup should not be applied to classes (by ToxicFrog) fix memory leaks related to selection_new() (pr #782 by argrath) wished-for doors in wizmode always vertical (pr #788 by entrez) vampire shapeshifting in a door (pr #794 by entrez) split "act_on_act" into separate function (pr #777 by argrath) unnecessary null-check on parsesymbols() (pr #793 by argrath) split cleaning-up on gd_move() into separate function (pr #791 by argrath) from xNetHack: better handling for monsters putting on equipment; fixes issue #843: "Mon dies. Mon puts on . The seemingly dead Mon rises as a vampire." add Unicode support to DOS Curses port (pr #889 by chasonr) add Unicode support to Win32 (pr #903 by chasonr) add Unicode support to Qt (pr #910 by chasonr) add Unicode, IBMgraphics and DECgraphics support to X11 (pr #923 by chasonr) add some glue code for those that might wish to build with 3rd party fmod sound library support (pr #962 by MrEveryDay98) add new options 'nopick_dropped' and 'pickup_stolen' options to avoid auto-pickup of items dropped by hero and to auto-pickup things previously stolen from hero if moved upon while autopickup is On; both bypass pickup_types and autopickup_exceptions (pr #1140 by entrez) fix msg_window:combination and TTY getlin() ^P (pr #1155 by entrez) remove a null sobj check from gold_detect that was situated after dereferences had already been done (pr #1173 by argrath) and adjust prototype in extern.h check for valid indexes of def_monsyms[] and def_oc_syms[] in choose_classes_menu() (pr #1179 by argrath) split damage from acid potion into separate function (pr #1195 by argrath) add swallow and explosion glyphs to glyph_to_cmap() (pr #1277 by ars3niy) split "cannot_push" on moverock_done() into a separate function (pr #1282 by argrath) split making pits on do_earthquake() into a separate function and eliminate some gotos on do_earthquake() (pr #1287 by argrath) update the WASM cross-compile to work with the current code (pr #1331 by guillaumebrunerie) add silver maces (pr #1405 by disperse) applied several source comment spelling or grammar fixes that were linked to an old rec.games.roguelike.nethack post from May 2006 by Arthur J. O'Dwyer modernize code of LaTeX Guidebook (pr #1473 by Daniel Clow) restore ability for a characteristic also resets exercise/abuse for that characteristic (pr #1403 by greg-kennedy) cross-compilation for the Amiga on Linux (pr #1494 by ingpaschke) 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 macOS 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.txt file. function reglyph_darkroom() relocated from options.c to display.c resurrect 'makedefs -m' to be able to derive default mons[].difficulty 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 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 remove obsolete roles[].femalenum and rename roles[].malenum to roles[].mnum; likewise for races[] add git submodule support to the Makefiles by specifying git=1 or GIT=1 on the make command add TT_NONE==0, renumber other u.utraptype values so that TT_BEARTRAP isn't 0 for Planes of Water and Air, save the air bubbles and clouds with the level rather than as game state; affects wizard mode ^V and #wizmakemap switch to a flags arg on newcham() in place of the pair of boolean args replace some old 'time_t' hackery in system.h and hacklib.c with something less obtrusive in unixconf.h remove the per dungeon level door limit remove various '#if LINT' hacks used to suppress warnings from pre-ANSI 'lint' VMS: removed NO_VSNPRINTF conditional code remove the window port get_menu_coloring() calls from all the existing window ports, and implement the functionality on the core-side of the interface prior to calling the window port's foo_add_menu() function remove TEXTCOLOR build option relocate general-purpose function choose_classes_menu(), from options.c to windows.c remove register from variable declarations make glyph_to_cmap() a function instead of a macro