NetHack 4 homepage | 4.3-beta1

About this document: Last modified by Alex Smith, 2014-05-31

Copyright (C) 2013 Alex Smith.

This document is licensed under the NetHack General Public License. See libnethack/dat/license for details.

NetHack 4.3-beta1 Changelog

This document describes the changes that have been made in the NetHack 4 series (i.e. that do not exist in NetHack 3.4.3, the last version of the NetHack 3 series), up to 4.3-beta1.

Changes are divided into categories:

Documentation improvements are not listed here. Although there are many of those too, it should be easy to find them via looking in the various doc/ subfolders of the NetHack 4 distribution. Additionally, changes that cancel each other out (e.g. if a command was deleted and then re-added) are not necessarily listed here, although they may be mentioned to provide historical context.

Each change is marked with various tags, to help learn about the history of the change:

Major Gameplay Changes


>: It's now possible to enter a pit intentionally using the > command. (Un, C343-12, a8e8089, 827f0fe, cad32dd, dd56886)

a: Opening and closing the Castle drawbridge via music now takes time. (Un, C343-318, 878e409)

a: When writing a scroll by its actual type (e.g. scroll of identify), having seen an unidentified but type-named scroll of the same sort (e.g. scroll called unknown 1 that is actualy, unbeknownst to the character, a scroll of identify) no longer guarantess success in writing the scroll. (Grunt, C343-403, 0aa9c5e)

C: The C command no longer identifies high priests at range. (Nitro, SC343-12, be3e353)

e: Protection from eaten rings is no longer considered to be divinely sourced. (4, f66dbaf)

E: Wresting a wand via engraving with it now takes time. (Bilious, C343-246, a93e3bc)

r: Spellbooks can now be read even if spell memory is not low (although doing so still damages the spellbook). (Ace, 7cd834e)

x: No longer costs time (in order to avoid the need to toggle the pushweapon option repeatedly in order to set up weapons for two-weapon fighting as fast as possible). (Ace, 8c894a3)

Z: Spells that ask for a position can now target monsters that are visible via infravision/telepathy, even if you cannot see the target location using visible light. (Grunt, C341-7, 3df1f97)

Multi-turn commands can now be interrupted voluntarily by the player, if they would be interrupted by the appearance of a monster, via specifying a maximum number of turns to perform the command in the same way as a repeat count, or (if the animation option is set to animate interruptible commands) by pressing a key or clicking on the map. (Engine code from Nitro, 17a9532; interface code from 4, 41fcf8c, c1d4e5b)

Non-time-consuming commands no longer cause the character to sink further into lava. (Nitro, f4754b2, 86b2d0c)


Scrolls of destroy armor no longer give permanent boosts to stats when wearing cursed stat-boosting items. (Ace, C343-30, 90ee9a8)

Jumping boots and potions of oil now automatically ID (upon equipping them and game start, respectively), in order to avoid a need to test them with #jump or the a command. (Ace, 9dc6d96)

Amnesia sources (such as the scroll) no longer causes the character to forget information that the player could have remembered, or written down. This saves the player the tedium of having to draw all the maps out on paper in case they get amnesia'd. To compensate, amnesia now drains skill points. Additionally, it is no longer possible to control which spells are lost to amnesia via reordering the list, and spells lost to amnesia have their spell memory reduced to 0, rather than being deleted from the list entirely. (Ace and 4, ae101af, 639861d, 863ac16)

Scrolls of charging now make the charge/recharge status of their targets permanently visible (so that you can see that they've been recharged); and light sources now have a visible charge count. (4, 66ec75d)

Items which are otherwise identical now stack even if one has a known beatitude and the other doesn't (this is to compensate for side effects of container beatitude identification). (4, 9156017)

It is now much more difficult to explode a bag of holding; placing a wand of cancellation or bag of tricks in it will drain the offending item of all charges (so that it can be inserted safely), whereas nesting bags of holding will fail outright unless the bags are insulated from each other with at least two layers of sacks (at which point the nest is assume to be intentional, and has the usual explosion chances). (4, e4fd0bd)

Sunsword now stops glowing if a monster holding it is killed. (Grunt, C343-106, 5e430da)

Monsters and Polyforms

e: Floating eyes are now impossible for the player to hit with melee attacks, unless the player is protected from gazes. This is because a good interface would require confirmation to attack them, thus rendering them almost entirely unthreatening, so something else had to be done in order to ensure that they remained dangerous; the old and new implementations both effectively make them impossible to eliminate via melee without gaze protection, but the new implementation is a lot less typo-sensitive. (Ace, d83177f)

G: Gnomes now have a chance at generating with candles (although unlike in AceHack, they don't actually use them, in order to avoid inventory clutter); this is to make it possible to farm candles in order to avoid the game becoming unwinnable due to a candle shortage. (4, 9dc7a4c)

Monsters are now capable of using their special attacks even if tame; and more special attacks now work for polymorphed players than before. (Grunt and Ace, 53a8e41, 05587f7, 3df54b4, 239ed8e, 93811e3, eb5c83c, 7c67ab1, 867118c)

Monsters who naturally live on a level (rather than spawning later) now have a difficulty mostly independent of the player's level (with some exceptions in the late-game to keep the game balance close to 3.4.3; in the early game (pre-D:12), the game wil calculate monster difficulty as though the player's level were 1). (Nitro and 4, 98a3b47, 0ea054c)

Tame monster will no longer attack nor be attacked when under 1/3 health; when injured but on more health, they will be more cautious about what they fight. They also no longer attack peaceful monsters, unless you anger the peaceful monster first. As a safeguard against being caught in crossfire, tame monsters at below 1/3 health are now almost impossible to hit. (4, 037731d)

Hostile monsters will now attack each other if they dislike each other naturally (e.g. elves versus orcs); this change was considered acceptable for NetHack 4 because it fits in with the theme of improved AI and is almost entirely to the player's benefit. (Un, 4176ec9)


Stairways that lead between branches are now a different map entity from stairways that lead to another level within a branch (and thus look different, and are described differently on farlook); this is a gameplay change because there's no longer a need to take them to see where they lead. (Ace, 6929bda)

The Vibrating Square is now classified as a trap (and thus shows up in the player's memory after finding it, avoiding the need to mark it, and can be detected via means of trap detection). (4, e219111)

The chest in the Castle that contains the wand of wishing can no longer be trapped. (4, 8ec73b5)


Autopickup is now much more customizable, adding filters for items based on things like beatitude or partial matches on the name, and there is also an option for whether thrown items should automatically be marked for autopickup. (Bilious and Nitro, 2327b13, a5bc53b, 4a7e22e, 18bab34)

Scoring and Conducts

The scoring system has radically changed; the system used in the NetHack 3 series was massively abusable and did not do a good job of measuring progress through the game (it was pretty much entirely dominated by monster kills). The NetHack 4 series tracks score in a number of different categories, each with diminishing returns, ensuring that a high score requires a range of different score-maximizing activities. (Ace, 40a84c6, 5bfb6e5, 68a29f0)

Some new conducts have been added in order to discourage degenerate behaviour, and allow players to prove that they haven't engaged in it: Elberethless and puddingsplitless. (4, 3f0b895)

Alternative Game Mode Changes

Debug (Wizard) Mode

In local play, there is no longer a restriction based on UNIX username or (on Windows) character name as to who can enter wizard mode. (Nitro, a50250c)

Games created outside wizard mode can no longer be loaded inside wizard/explore mode in order to gain spoilers about them and then resume the original, standard game. (Nitro, 856b22a)

Wizard mode teleportation has been split in two, in order to ease testing the teleportation code itself. ^T now does not allow for any sort of teleportation that would not be allowed in regular play. In order to teleport without restrictions in wizard mode, use ^F. (4, 3cf2f4a, bfdc807)

Monster creation in wizard mode now only prompts for which type of monster to create if the #genesis command is used explicitly; and the #genesis command now allows a quantity of monster to be specified at the prompt. (4, d179170)

Two new wizard mode commands are added in order to reduce interference of monsters: #levelcide to destroy all monsters on the level (saving you from having to wish up a scroll of genocide), and #togglegen to stop monsters generating altogether (so that you don't have to interrupt whatever you were doing to levelcide). (4, 2a6738b, c4b063c)

A new wizard mode command #hpset fully heals the character; alternatively, a count can be given to precisely set the character's HP to some other value. (4, ad21853)

In the wizard mode spoilers on ^X, the current alignment cap and the player's hunger level are now visible. (Un, 145e145, 6ec5736)

While in wizard mode, confused level teleport on the Planes no longer has a chance of crashing the game. (Grunt, C343-5, 3df1f97)

Two new commands are added to accompany #panic for testing the game's error recovery routines: #impossible causes a nonfatal error (unlike #panic which causes a fatal error), and #desync corrupts the binary save. (4, 7a3978f)

A new debug command #rewind allows rewinding of save files to earlier states, perhaps as part of a manual recovery process, or for testing; it rewinds to the current turn, and is intended for use while replaying a game. (It can also undo a game over, although it will not move the save file back into the saves directory; you'll have to do that by hand.) (4, c1d9296)

The #vision command now additionally shows which areas are considered by the game to be lit. (4, 35cdb4f)

The environment variables that could be used to skew the RNG for special room generation no longer exist (they caused problems with save file reproducibility). (4, 83dae9b)

New Game Modes

Some new challenge game modes have been added, controlled by birth options: permablind, an implementation of the Zen conduct, which leaves your character unable to see all game; and permahallu, in which your character spends the entire game hallucinating. (4 and Bilious, fd61601, ffe5ae5, 8fd78aa)

A new game mode polyinit lets you play the whole game polymorphed into a monster; you select your polyform as a birth option, and you start polymorphed into that form and with intrinsic unchanging. Games in this game mode are not eligible for the high score table. (4, bdb83fb)

Minor Gameplay Changes


If two objects have the same textual description, they now will also show with the same tile in tiles view (rather than using different tiles that look identical by default, an information leak). (Nitro, a535b83)

Unexplored area, dark parts of a room, and known stone are now distinct objects to the display system, and can display differently (and do display differently in tiles mode); this makes magic mapping marginally more informative. (Nitro, Dyna, Un and 4, 2ad693c, e3ee161, f1bcc95)

Inventory displays are now sorted by the type of item. (This is a minor gameplay change because it makes it harder to exploit information on the order of items in bones files.) (Bilious, Nitro, Un and Dyna, 1ae9b87, e274847, 4d26cb4, 1c153d6)

Inventory displays now show the weight of the item they're displaying. (probably Nitro, 34f1e85 and others). Some items had their weights adjusted in order to avoid spoilers from this. (4, 5a6e10f)

Items in shops now have price tags attached, without needing to have to chat to the shopkeeper or pick them up to get a price quote. (Un, 9d7ef39)

Hallucination now rerolls appearances somewhat less often (once per time-consuming action for most hallucinated objects, rather than once per screen refresh). (4, 4c8b7da)


>: The game no longer discloses information about the ground when pressing > when blind and levitating. (Grunt, C343-32, 4feb4aa)

+: The player may now assign known spells to any letter, not just swap the letters of known spells. (4, 6a5eec7)

a: Candles can now be placed into candelabra even underwater. (Bilious, C343-238, 5c6ed21)

a: Digging into a pre-existing hole is no longer allowed. (Grunt, C343-78, cbf4fce)

a: Time usage for the a command is now more consistent: it takes time if any actual action happened or if the character tried and failed, no time if the action was aborted. (Grunt and 4, C343-353, C343-382, dca24d1, b00d3fd)

a: Touchstones can now have arbitrary objects rubbed on them even if identified. (4, C343-124, C343-130, dc752a1)

a: You can now use each stethoscope in your inventory for free once per turn, rather than being able to use one stethoscope total (unless you saved and restored in between, in which case in 3.4.3 you could use the same stethoscope as often as you liked). (Nitro and 4, f342510, 18db100)

A: Now allows equipping items into arbitrary slots (e.g. changing your secondary weapon slot while wielding cursed weapon), in addition to de-equipping. The timing rules have also changed, because they were entirely inconsistent in 3.4.3; for many items, A will now be one action slower, because the 3.4.3 version of A contained a bug in its timing calculations. (4, 983bdde)

C: If your finger slips while naming an object, the replacement name now includes z as a possible letter for the resulting random typo. (4, C343-364, a26b2a4)

d: Dropping a container on an altar now reveals the beatitude of the items inside the container, thus saving the player from having to unpack it manually. (Ace, 4258309)

d: Dropping a ring down a sink now formally identifies it (rather than prompting the player to informally identify it). (Un, 4f0a367)

^D: Kicking an empty space now takes time. (Un, C343-298, 92f43f4)

^D: Cancelling a kick on a monster now takes no time and makes no noise. (Grunt, a2ec6da)

^D: The effect of kicking a steed no longer depends on which commands you use for movement (i.e. it responds to travel, and moving one square at a time, the same way). (4, 6860cd2)

^D: Causing a monster to reel via kicking it with kicking boots now identifies the boots as kicking boots. (4, 243d312..e7c4029)

e: Now warns upon dangerous attempts to eat food; warnings for tainted corpses no longer cost an existing edibility intrinsic. (Ace and 4, 649a6b7, 5e5f135)

e: No longer works on artifacts that can't be touched. (Grunt, C343-244, 7ed1784)

E: Now formally IDs the type of wand if the engrave attempt produces a unique message. (Ace, 1e34184)

E: Now works with pick-axes. (4, C343-145, a911545)

^E: The number of slots remaining (and available for enhancing skills) is now shown on the skill enhancement menu. (Ace and Dyna, 529b276, a9047bf)

F: Can now be used to force attacks upon terrain. This is mostly only useful as a shortcut for applying a wielded pick-axe; however, it opens some new (admittedly, likely useless) possibilities, like whacking a wall with a sword, which were not previously possible. (Grunt, C343-322, f7ffd31)

P, W: Now prints a message if you just equipped a cursed set of armour. (The A and i commands will also print the message, if used to emulate P or W.) (4, c0d5ee2)

q, #pray: These commands no longer interact with dungeon features while engulfed. (Grunt, C343-63, 8c03941)

r: Now formally identifies enchant armour scrolls when they are used to create DSM. (Dyna, c9ffd37)

s: Finding a mimic via a search no longer wakes it; this is to enable players/interfaces to un-bind the wait command if they wish to free up keys. (Ace, 8208917)

S: Saving no longer resets the character's movement energy to 12, and thus no longer loses any bonus actions the character might have that turn nor any progress towards accumulating bonus actions on future turns. (Nitro, 0cd2e80)

S: Saving no longer blocks the ability to resume the following commands after interruption: r. (Nitro, 5c56a81)

t: No longer works without hands. (Grunt, C343-243, d07e9cb)

T: Has had its timing rules change, because they were inconsistent in 3.4.3; now takes the same time as the new A command would take, which is typically faster than T from 3.4.3 (except when in a slow polyform), but slower than A from 3.4.3. (4, e5262d7)

^T: No longer teleports leashed pets adjacent to you if the teleport fails (e.g. due to being on a no-teleport level) or is cancelled. (4, c3bdbc4)

z: Now formally IDs a wand as teleport if you zap yourself under the same circumstances as if you zap your steed. (4, b7347be)

^X: Now shows the total inventory weight, and how close this is to the nearest point where burden level changes. (Ace, 237951d)

#force: Now works with pick-axes. (4, C343-145, a911545)

#force: Now charged for if used on an unpaid item. (Grunt, C343-241, 7704a8f)

#offer: If the character should be given a sacrifice gift but no coaligned artifacts are available, they will now be given an unaligned artifact as a gift, rather than the game becoming confused and failing to give a gift at all. (4, C343-358, aa45966)

#pray: The invulnerability period (if any) now protects against stinking clouds. (Grunt, 3f358cc)

#untrap: No longer works on monsters you can't reach due to levitation. (Grunt, C343-22, 628c7ec)

Interruptible multi-turn commands are now interrupted by the process of turning to stone. (Un, C343-74, f203351)

Interruptible multi-turn commands are no longer interrupted if an unseen monster misses the player with a breath or spit attack. (4, 39d6010)


Pearl rings are no longer capable of rusting. (Ace, C343-386, d97abba)

"leather spellbook" has been renamed "leather-bound spellbook", because it isn't made of leather. (Ace, C343-160, cc182fe)

Silver damage now works correctly while polymorphed, and from silver arrows. (Un and Ace, C343-2, C343-171, 97b97bb, 805f9ae)

Boulders created via polymorphing statues, or splitting a stack of boulders on a square, now block line of sight. (Ace and Grunt, C343-88, C343-114, ff8a0c1, 5cde50e, 607b0f5)

Cancelling an item near a shop now correctly checks whether or not the cancelled item is in the shop. (Nitro, C343-129, 93a1f3e)

Items owned by shops will be automatically identified if they're the only item in their weight and price range. (Ace, 767aa23, 5a6e10f)

Cursed light sources will be marked as such when they fail to light (affecting gameplay in a marginal way if they subsequently get cancelled and then randomly cursed, because the player will know that the random curse hit that item in particular). (Ace, 5736180)

The Candelabrum of Invocation no longer becomes permanently unusable if you take it to the Vibrating Square when it has exactly one turn left. (Grunt, C343-424, efac3c6)

The Candelabrum of Invocation's weight now includes the weight of the attached candles. (Grunt, bd97343)

Statues and containers will have the correct weight even if generated on special levels. (Grunt and 4, C343-36, f2b7b98, 4f69e13)

Beam-type wands that hit a monster no longer affect its corpse. (Grunt, C343-362, 2a36eed)

Greased projectiles now work the same way for monsters as for players. (Grunt, C343-47, 661239e)

Magic lamps now cease being magic in bones if the player died as a result of making a wish from them. (Grunt, C343-95, 3d7a853)

The wish parser now accepts undead monster corpses (e.g. "elf zombie corpse"), producing a corpse that could have been be produced as the result of killing that species of undead. (4, 83e49d2)

The Book of the Dead is now immune to lava even if the character holding it does not have fire resistance. (Grunt, a9267e4, 1b6f60e)

It's no longer possible to stand on lava with the aid of non-fireproof water walking boots and sufficiently many hitpoints. (Grunt and 4, SC343-3, 919fdb5, a591080)

Auto-cursing items now treat monsters the same way as players. (Grunt, C343-91, 69180c4)

The distance that thrown/kicked objects move now correctly respects the presence/absence of gravity, whether the floor is stone or ice, and whether the object is greased. (Grunt and 4, C343-27, 87bfcda, 80bd729)

Objects that provide drain resistance (such as Excalibur) are now immune to drain themselves. (Grunt, C343-442, dc37dab)

Helms of opposite alignment now reset alignment record in the same way that permaconversion does. (Grunt, C343-343, fbf8859)

Alchemical explosions now create noise. (Grunt, C343-351, 63dbb64)

Lizard corpses no longer slow monsters who eat them due to stunning or confusion. (4, C343-173, a4f65c4)

Rings can now be charged even if not formally IDed. (4, C343-290, 32dffda)

Shops now correctly charge for unpaid items whose enchantment has changed via enchantment scrolls or damage. (Grunt, C343-89, 9f00331)

Probing now observes the contents of a box containing Schrödinger's Cat. (Grunt, C343-263, 7e5bdca)

Bags of holding now round the weight of their contents correctly. (4, C343-418, cb6a6c9)

Drums of earthquake can no longer create pits inside holes or trapdoors, and no longer destroy beartraps (they disarm them instead, if they create a pit on the same square). (4, 277a41f)

Landmines and bear traps now have (nonrandomized, and distinct) unidentified appearances; this is mostly so that a land mine (the object) and a land mine (the trap) can be distinguished in config files, but has a very minor effect on scoring. (4, a76b51e)

Recently created comestibles can no longer be rotten (this feature was meant to be in 3.4.3, but there's a typo in the relevant code). (Un, ab81299)

Potions of blindness no longer grant blindness immunity when wielded or carried in the alternate weapon slot. (Dyna, 96fe8fe)

Players who cannot die to cursed or uncursed potions of sickness (due to poison resistance) now cannot die to blessed potions of sickness either. (4, SC343-2, c66219b)

Polymorphed equipped items remain equipped, if the new item fits into the same slot on the body. (4, b7e605c)

Amulets of unchanging can no longer be polymorphed, nor polymorphed into. (4, b7e605c)

Dipping potions of polymorph into another potion no longer causes them to be polymorphed (only the other way round). (4, b7e605c)

If a hat or helmet becomes cursed as a result of wearing it, its BCU status will become known immediately. (4, 8c25729)

Whistles are now identified upon use (because magic and tin whistles produce different messages). (4, 096007e)

Potions are now identified when thrown by a monster at the character, if this causes a unique message to be printed and the character was able to see the potion before it hit. (4, 3071b59)

Items on the D:1 upstairs are no longer autopickedup before the first turn of the game (in 3.4.3, they would be picked up even with autopickup off!). (4, 3769725)

Randomly generated splint mail on D:1 no longer generates rustproof for samurai. (4, 820b493)

Monsters and Polyforms

a: Antholes no longer generate if there are no ants to place in them. (4, 343-163, 02844f7)

A: The alignment of angels is now correctly displayed regardless of whether they are sent by particular gods or not. (Grunt, C343-122, 6f19361)

A: Ki-rins and couatls no longer wear armor. (Grunt, C341-18, 3df1f97)

b: Gelatinous cubes now die if they attempt to engulf Rider corpses (thus preventing the player from indirectly destroying the corpse). (Grunt, SC343-16, 7536ccc)

D: Disintegration attacks from black dragons now affect monster inventory the same way as player inventory. (4, b060883, cf276aa)

e,y: Exploding monsters are no longer visible while the effects of the explosion are calculated (so that, for instance, you will not hallucinate a random monster in the location where a black light exploded). (Grunt, C343-64, a143c93)

e,y: Exploding monsters are now correctly masked by hallucination. (Grunt, C343-128, f5964d4)

e: Spheres are now consistently incapable of picking up items. (4, C343-138, d2f3edd)

E: Air elementals are no longer solid. (4, C343-295, 1dae971)

E: Invisible stalkers now count as having a humanoid shape. (Grunt, C343-159, 1caa11b)

g: Gremlins now reset the entire state of protection when stealing protection, rather than leaving the amount of divine protection different from the amount of Defence granted by diving protection. (Un, C343-189, 2a3043c)

H: Players in giant polyform can no longer pick up boulders into inventory overflow slots. (Grunt, C343-225, 5338c20)

m: Mimics pretending to be doors now react more appropriately to attempts to lock or unlock them. (Grunt, C343-409, 23a2051)

m: If a mimic is somehow lead to the Rogue level, it will now pretend to be an open doorway rather than a door if placed into a doorway. (4, C343-34, C343-380, 81e5261)

m: Mimics will no longer pretend to be items or furniture in impossible locations (such as a fountain or boulder over a pit). (Grunt, C343-37, 3e94adf)

m: A player who is mimicking an object in mimic polyform will stop hiding if they polymorph into a non-mimic. (4, C343-391, 89eef0f)

m: Mimics mimicking objects that block sight (such as boulders and doors) no longer continue to block sight after being genocided. (Dyna, 2f9436c)

n,&: Demon princes no longer demand bribes from helpless players, and foocubi and nymphs no longer attempt to seduce or charm them. (Grunt, C343-137, e41bd77, 6092b66, 3d53054)

N: Players in guardian naga form now spit the correct sort of venom. (4, C343-153, 56eb207)

t: Players in trapper polyform are no longer described as hiding on the ceiling. (Grunt, C342-51, 3df1f97)

T: It's no longer possible to see an invisible troll revive (without see invisible). (Grunt, bdf06c2)

u: Unicorns can no longer catch gems while helpless. (Grunt, C343-115, b977028)

u: Unicorns in bones files are now correctly peaceful or hostile based on the alignment of the new player arriving on the level. (Grunt, C343-66, 0a9a09b)

w: The chance of long worms being cut is now based on the type of damage they take (slashing having more of a chance to cut them), then the shape of the weapon that attacks them. (4, 8782996)

W: Incorporeal monsters (ghosts and shades) can no longer be slimed. (Grunt, C343-81, 53922d0)

@: Resurrected quest leaders no longer forget their status as quest leaders. (Grunt, C343-98, 7c72caa)

@: Vault guard handling has been reworked to fix many of the outstanding bugs in it. (Grunt, C343-23, C343-125, C343-127, C343-166, C343-333, C343-432, C343-433, C343-435, b3dd07d, 7867ff7, 3775d40)

@: Nurses now take passive damage when healing players in passively damaging polyforms. (Grunt, SC343-15, e44e1cc)

@: Nurses now consistently treat characters holding nonweapons as being unarmed. (Un, 6865f90)

@: The Oracle of Delphi no longer welcomes characters that she's hostile to. (4, C343-181, 5113058)

&: When a djinni is pulled out of a lamp or bottle, if it is annoyed at the character for disturbing it, it now always generates hostile (rather than sometimes generating peaceful if the character is neutral). (Grunt, c9456af)

Monsters "shrieking in pain" now create noise. (Grunt, C343-65, 3e0ea7b)

Monsters can no longer equip shirts in zero time while wearing armor. (Grunt, C343-360, 1da4ce4)

Tame monsters can no longer dig on the Rogue level, if they couldn't dig there when hostile. (Grunt, C343-4, 06d2940)

Monsters can no longer jump over walls to evade kicks, nor teleport to evade kicks on a no-teleport level. (Grunt, C343-38, C343-73, 0f8cd36)

Passive damage taken by monsters now scales correctly on the number of attacks they made. (Grunt, C343-80, dbc3584)

Non-randomly-generating monsters no longer randomly generate on special levels. (Grunt, C343-415, a68925a)

Pets can now ascend even while eating. (Grunt, C343-83, c22e8e1)

Killing a tame pet from inside no longer spouts warning messages. (4, C343-299, e568e1b)

Monsters can no longer continue hiding if the corpse they're hiding under rots away, or if objects on the square are otherwise destroyed. (Grunt and 4, C343-33, C343-308, 7f16165, 4af2ed0)

Polyforms that are incapable of breathing can no longer use brass or woodwind instruments. (Grunt, SC343-1, 17fd2d5)

Monsters that do not cause physical damage now have their experience gains calculated correctly. (Grunt, C343-70, 80f94d9)

Steeds and engulfing monsters are now capable of dropping corpses. (Grunt, C343-107, 6cf9497)

Disintegrating a steed no longer makes it impossible to saddle. (Nitro, C343-176, 3bf9166)

Monsters that can ooze under doors can also ooze through diagonal gaps. (Grunt, C343-144, 892c156)

Monsters no longer get stuck in corridors while fleeing. (Dyna, f71440b)

Monsters will no longer attack hiding players with ranged attacks. (Grunt, C343-377, 81f437f)

The monster clerical "lightning" spell now works consistently with other forms of lightning with respect to blinding the player. (Grunt, C342-46, 7438364)


Rolling boulder traps no longer generate on lava. (Un, 39a4599)

Rolling boulder traps now correctly reset for the next victim if they kill the player's character (and are subsequently loaded from bones). (Grunt, C343-49, 549ba7a)

It's no longer possible to interact with items at the bottom of a pit with melee-range commands (such as kicking) unless you are in the pit yourself, or have phasing. (4, C343-16, C343-17, 7d86789)

Fire traps below ice no longer perform their effects twice when triggered once. (Grunt, C343-42, 5577e8d)

Characters in water or lava now take water/fire damage regardless of whether or not they move. (Grunt, 6533efe, f8b9d68)

It's no longer possible to create a pit on a drawbridge via using a land mine. (Grunt, C343-82, 77c8aa0)

Monsters and characters that escape a drawbridge collapse now correctly fall into the water/lava beneath it, rather than continuing to stand in midair. (Grunt, C343-266, 687e769)

The moat created by the Invocation now affects monsters immediately, rather than with a 1-turn delay. (Grunt, cd40b25)

Shopkeepers no longer sometimes forget about pits dug in their shops. (Grunt, 7d66e21)

Lava no longer gives an extra turn of survival if your water walking boots burn up. (Grunt, a6951c6)

The time in the dungeon (for things like moon phase and werewolf transformations) is now specified as an offset from UTC (the "timezone" birth option), rather than using the local time of the server; this both allows remote players to get moon phases more in line with their local time, and removes exploits from malicious daylight saving definitions. (4, 236c80b)


Removing an amulet of restful sleep no longer removes intrinsic "sleepitis". (other sources, C343-356, c5e27fb)

Lifesaving upon unpolymorphing from a stoning-resistant form now unwields cockatrice corpses. (GruntHack and other sources, C343-222, f4be125, 73f6078)

Killing a monster with an unknown rolling boulder trap no longer breaks pacifist. (Un, 62a8438)

Unconcious characters can no longer see. (Grunt, C343-101, fccd7a4)

Characters in lava can no longer be slimed. (Grunt, C343-232, 6533efe)

Levitation now stacks correctly with flying, and interrupts multi-turn commands when it ends. (Grunt, e90f457)

Hunger now interrupts multi-turn actions. (Dyna, f80ea2f)

When stoning a monster from the inside, punishment is now handled correctly. (Grunt, C343-59, a194db1)

Touchstones in starting inventory no longer give a starting proficiency with slings. (Grunt, C343-355, ccf75ee)

Stacks of daggers or ammo in starting inventory now start quivered. (Dyna, 1d6a7e1, d551790)

Swallowing a cockatrice whole now violates foodless conduct even if the character dies in the process. (Grunt, C343-134, a65cf62)

Reading the Book of the Dead now breaks illiterate conduct. However, it can be invoked instead, for the same results as reading it, but without breaking the conduct; and there is a message letting players know about this so that they don't break the conduct by mistake. (Bilious, 8fd78aa)

Clairvoyance granted by the Amulet of Yendor is now visible on enlightenment. (4, 4f08317)

Accuracy bonuses from martial arts / bare-handed skill are now taken into account (in 3.4.3, there was code to calculate them, but the code for attacking forgot to call it). (Spork, 757c4d6)

Helplessness sources are now tracked independently (thus, it's no longer the case that 4 turns of sleep + 20 turns of paralysis = 20 turns of sleep, as in previous versions of NetHack). (4, 971d4e9, c55c327)

The blindness from stinking clouds now works consistently regardless of the speed of the character. (4, 2415414)


Some messages have had typo fixes. (Un, Ace, Grunt, 4 and Dyna, C343-8, C343-24, C343-45, C343-54, C343-55, C343-57, C343-58, C343-77, C343-90, C343-104, C343-109, C343-111, C343-116, C343-123, C343-131, C343-136, C343-155, C343-183, C343-211, C343-235, C343-258, C343-259, C343-345, C343-379, C343-399, C343-438, 9528d39, f18503d, 63329da, 6069675, 25bd1d0, b7dafb1, 1ab7536, 660ac1f, adce07d, d35ea64, 09b7802, ed3c54c, 2cce8e1, 0c2f758, e95ea48, 0333ed2, 07fe690, f809ede, e609855, a78bfcf, 02e6a13, 5d40e9f, e785e38, 6ada174, 4c37976, 6140ba9)

The game no longer produces misleading messages when healing an invisible monster, scaring a mimicking mimic, using a drum of earthquake while trapped, sitting down after escaping from a pit, failing to light a light source while blind, attaching a stack of candles to a candelabrum with one free slot left, teleporting an engulfing monster using a quantum mechanic polyform, being attacked by a monster with no attacks while praying, farlooking a monster seen only via astral vision, observing a monster turn invisible via telepathy, dying in a shop with multiple shopkeepers on the level, chatting to a sleeping steed, removing levitation while riding a flying steed, pushing a boulder into a pool while riding, pushing a boulder onto a level teleporter, or using a pickaxe when standing on water. (Ace, Un, Grunt and 4, C343-7, C343-15, C343-18, C343-50, C343-56 C343-69, C343-72, C343-152, C343-174, C343-202, C343-233, d35ea64, 75888c3, 50b8255, a546d6b, 85054d7, 8c6d549, c0fa205, 3e7219f, 065bac4, 73156d5, 0a8ecf8, 7515046, 4ed3165, 71b9a83)

Climbing a ladder no longer produces redundant messages. (Ace, 6f55aca)

The water in the Plane of Water is now correctly described in messages. (Grunt, C343-26, C343-325, C343-314, 4605b9b, de18364)

You can no longer hear rolling boulder traps while blind and asleep. (Grunt, C343-41, 7334f64)

Messages now correctly distinguish between "hats" and "helmets". (Grunt, C343-28, 7f26bd7)

Messages involving mirrors now respect their identification status. (Grunt, C343-118, 1dfa2e1)

Messages for displacing pets into traps are now printed in the right order. (Grunt, C343-71, 14e2d7f)

If a monster is wielding a stack of items, messages now correctly describe them as holding only one of them. (Grunt and 4, C343-40, C343-168, ce36a66, 9628c2c)

The game now always chooses the correct variant of the "You can move again." message when helplessness ends, rather than sometimes reusing the previous message. (Grunt and 4, C343-84, 218cc7b, ba8ede8)

Many new hallucinatory messages and "you can't do that" messages were added. (Un and 4, 4cbb620, bb5f3d0 and others)

Erodeproofing now takes precedence over maximum erosion status when giving feedback for why an object cannot be eroded. (Grunt, 593c6c7)

Messages for steeds being killed by their riders now allow for the fact that riders are always aware of their steed. (Grunt, c063835)

When rumour sources want to exercise or abuse wisdom, this is now correctly tied to the truthfulness/usefulness of the rumour. (4, C343-178, 125b1c9)

The message for a shopkeeper being after your hide now respects polymorphed forms. (4, 10eb057)

The game now keeps better track of causes of death across turns, preventing you from being turned to slime by a scroll of genocide, among others. (4, C343-219, 75e737c, 24ac31b, 21cbbca)

Objects on lava burning up now always have messages printed for them. (4, a6951c6, 8d7b8d9)

Crash / Memory Corruption Fixes

Bisecting a long worm on 1hp, or at level 0, no longer crashes the game. (Un, C343-324, C343-384, ab1d19f, 26199b2)

Throwing a potion at iron bars no longer crashes the game if it subsequently hits a monster. (Un, C343-100, 44fef77)

The game no longer corrupts memory when destroying the following items while wielded: cream pie via a; candle or potion of oil via burn timeout; figurine via autotransformation; potion of polymorph via quaffing (and transforming into something with no hands). (Un and Ace, C343-218, C343-275, C343-276, C343-398, 0fcbbbf, 71cf898)

The game no longer corrupts memory when potions of acid are destroyed in water. (Un, C343-179, 319b504)

The game now correctly tracks items when dying in a shop while two-weaponing. (Un, C343-270, 0114692)

The game no longer corrupts memory upon probing a reanimated statue. (Un, C343-94, SC343-8, c6bf9dd)

The game no longer corrupts memory upon attempting to travel from (or maybe to?) a location equidistant from a very large number of boulders. (Ace, ceec202)

Bullwhips no longer corrupt memory when applied off the edge of the map. (Grunt, C343-383, 7831df3)

The game no longer crashes when an engulfing monster expels a player onto a magic trap and is one of multiple monsters that gets tamed as a result. (Grunt, C343-147, 04d133a)

The game no longer crashes upon repeatedly giving an unidentified item very long names using the C commands, and/or dipping such an item. (Un, 2eddb58, ab27767)

The game no longer spews warnings upon angering one shopkeeper while holding items belonging to another. (Dyna, d995ed1)

The game no longer crashes if the character is teleported onto a sink while equipping boots of levitation. (4, 59c8439)

Interface Improvements

It should be noted that the interface was entirely rewritten for NitroHack, and thus NetHack 4. Thus, there are a large number of minor interface differences not listed here due to differences in replicating the original behaviour in the reimplementation. The NetHack 4 developers have aimed to keep it keystroke-compatible while in-game, though, except in the cases listed here.


!: The ! command for starting a shell no longer exists; pressing it by mistake was much more common than using it for an actual shell, and the ^Z suspend command (which was removed by NitroHack but re-added in NetHack 4) is probably more useful. (Nitro and 4, c2316d2, 10645f3)

!: The ! command now shows a menu that contains commands that are generally applicable regardless of the character's situation (such as changing options, viewing character statistics, and saving the game); the commands each have their own individual bindings too, but the combined menu may be easier for some players to remember. (4, e73128a)

_: Travel now understands that the player might want to route through traps; it will still try to avoid traps, but if avoiding a trap is impossible or would require going a long way out of the way, it will route to just before the trap and then wait for more input. (Ace, 18888d8)

_: Travel is now interrupted by hostile monsters capable of attacking, even if not adjacent. (The travel_interrupt option controls this behaviour, and can be turned off to require monsters to be adjacent before interrupting travel.) It is also now interrupted by confusion. (Ace and Dyna, f52e890, 7dc7ea3, a7f6b94)

_: Travel now treats boulders in Sokoban the same way that it treats walls, making it much safer to use. (Dyna, 4b57d83)

_: Travel no longer gets stuck in infinite loops in some corner cases involving unreachable spaces and obstacles that block sight. (Dyna, 02da53e)

_: Travel is no longer stopped by engravings that the player has seen before. (Dyna, 2d5d701)

_: Travel (and farmove and autoexplore) now respect the movecommand option, meaning (among other things) that they will displace pets if normal movement would. (4, 6860cd2)

:: Has been split into two commands: : (lists what is here without feeling the square, equivalent to the old : when sighted), and ^G (feels the ground, costing a turn and touching items on it, equivalent to the old : when blind). (4, 955a4e7, f394be6, 1c76f8f)

;: Now shows a quick description of map cells as the cursor is moved over them, so that there's no need to select a number of cells you want to identify individually. (4, d90a5a1)

;: Now understands the difference between ./,/:/; confirmations, just as / does. (4, 5edb710)

/: Now contains a database of item descriptions, rather than flavour text. (4, b9afc36)

+: Now lists how much memory of spells remains (something that previously could have been tracked by hand). (Ace, 3bb41b3)

>: No longer automatically digs downwards unless the autodigdown option is set. (Dyna, 4bf0151)

a: No longer breaks wands; that was moved to V, in order to reduce the chance of typos. (Ace and 4, 120cdac, 5a49ff0)

a: a, is now accepted as a synonym for #loot. (Ace, 6b75b3c)

a: Now respects the movecommand (formerly confirm) option when pounding monsters with a polearm. (Grunt, C343-305, dca24d1)

a: Now accepts a count, allowing in particular lighting some of a stack of candles. (4, c0a22a4)

^A: Now actually works. It remembers arguments to a command in order to be able to repeat them; and can also now be used to resume an interrupted multi-turn action. (4, 017ca27, 828dbbb)

C: #name and C (in addition to some new commands, such as #annotate) have been merged into a single menu, bound to C by default; the original commands exist with no bindings, so that it is possible to restore the NetHack 3 behaviour via rebinding keys. (NAO, Nitro and 4, c1e315a, fe36496, 9c7596c)

C: Items with randomized appearances can now be type-named even if you don't have a copy of the item handy to type-name (thus saving you from having to remember until another item with the same appearance finds its way to your inventory); because of this, randomized-appearance items no longer prompt for names when destroyed (rather, there is a shortcut in the C menu to name the most recently destroyed randomized-appearance item). (Ace, 9562e5c)

^C: Now a synonym for ! (open menu), but one which works even at prompts (thus allowing you to save via opening the menu at a prompt, and then choosing to save from the menu). Note that only a limited range of functionality is available from the menu while at a prompt. (4, 5b6b996)

D: Now allows selection of all unidentified items. (Nitro, a854a21)

e: Eating from the ground now works like Slash'EM, using e, (and a menu if there's more than one item) rather than ey to eat items on the ground, and thus cutting down on food-related typos. (Ace, Dyna and 4, 28b83ea, abba6bc, 1cadf2d)

^E: A new shortcut for writing "Elbereth" on the floor using your fingers (nothing that couldn't have been done with the E command, but it's faster to type). (4, 24e0071)

f: When firing with an empty quiver, you can choose an item to quiver and the item will be both fired, and quivered for future firings. (Bilious and Dyna, 1115668, c489412)

g,G,5: The difference between these commands (whether they stop at intersections) is now controlled via the corridorbranch option, not which command you use, and the three are now identical (freeing up any of them to be rebound, should you need more keys for whatever reason). (4, b3a276f..9ca21c3 and others)

^G: The old ^G (debug mode create monster) was moved to #genesis; ^G now feels the ground for items. (4, f394be6, 1c76f8f)

h, etc.: Walking into a closed door is now interpreted as an attempt to open it. (Ace, cea2284)

h, etc.: Walking into an always-peaceful monster will chat to them rather than atacking them, unless an F prefix is given. (Ace, 361ed66)

h, etc.: What these commands do is now controllable via the movecommand option, which offers a range of possibilities, such as the standard behaviour, and a pacifist setting that never attacks. This replaces the confirm option (confirm off corresponds to a movecommand of indiscriminate), and the safe_pet option (safe_pet off corresponds to a movecommand of traditional), and has many other possibilities. (4, 6860cd2)

H, etc.: Shift-moving down a path that eventually collides with a monster no longer automatically attacks it. (4, 4fd86a5)

i: Selecting an object from the inventory menu i now produces a menu of all commands that work with that object. (Ace, Un, Nitro and Dyna, 59363d1, 7f91acf, 5490bef, 95ce923 and others)

^I: You can now split a stack of items in inventory via entering the number of items you wish to split out of the stack between the ^I or #adjust and the inventory letter for the stack. (Bilious and Nitro, 7092675)

m: The m command is now the only way to start entering water/lava (unless levitating, or confused/stunned/otherwise unaware of the danger), in order to cut down on typo-related item destruction and death. (Ace, eadc0ef)

o: Now closes doors in addition to opening them, and unlocks locked doors (using whichever unlocking tool you used most recently). (Ace, 03643af, 6ee1f33)

^O: The game now automatically tracks notes on interesting dungeon features that the character has seen on levels they have visited, via a new command ^O/#overview; additionally, a character can select a level from this menu to view their memory of it, and name levels using the #annotate or Cf commands. (Bilious, Un, Dyna, Nitro and 4, a155515, c461257, 5083a8e, 05472d5, 3e4a189, b015a4c, a765dbf, 8fb4e51, and others)

p: The p command can now be cancelled without having to say "no" to each item individually. (Ace, 962456a)

P,R,T,W: The W/P commands have been merged, as have the T/R commands. By default, the two keybindings for each of the merged commands are entirely interchangeable, but this frees up keys so that you could rebind them to something else if you wanted to. (4, 24c4359)

P,R,T,W: Can now equip and unequip items in slots blocked by other items; the outside slots will be temporarily removed to allow for the multistage equip. (4, e5262d7)

q: Quaffing from sinks and fountains is now on q, rather than 3.4.3's qy (which broke muscle memory when attempting to quaff from inventory slot y). (Ace, a113165)

r: A scroll of charging you just used no longer appears in the list of objects that could potentially be charged. (4, C343-161, ef93676)

R,T: The T/R commands will prompt for an object even if there is only one possibility, so that objects will not be removed due to typos. (Nitro, 723776d)

S: The S command now also allows quitting the game, S!y (chosen to be hard to type, and thus unlikely to be typed by mistake). (Ace, a07c105, 0b37bc4)

^T: Cancelling a controlled ^T command with Escape no longer costs a turn. (Dyna, 5f60575)

v: The game now has an "autoexplore" command, bound to v by default, that automatically explores until it finds something interesting or is interrupted (by a monster, trap, or similar effect). (Ace, Un and Dyna, 5f2e241..d1d221d, a06d1c8, 34df1f3, 02c4698..3479754, 579d288..3237483, d117d1f, 2f85168, dffe879, 6bf8e3d)

V: Now also allows you to rub items, if they're suitable for rubbing rather than invoking, and is the new way to break wands. (4, 120cdac)

X: The X command for entering explore mode no longer exists; X is now bound to #twoweapon. (Nitro and Ace, a2c8999, 74dea97)

X: When attempting to enter two-weapon mode with an invalid character, the game explains what is wrong. (Un and 4, 21bc711, bdd6251, fd16f77)

^X: The ^X command now records a range of information (such as which intrinsics the character has gained, or what monsters the character has killed) that could have been (and often was) tracked manually by the player using out-of-game notes. (Ace, e894514..a7a0ce7, cd9df40)

Z: Directional and positional spells can now be cancelled at the prompt that requests a direction or position. (4, e75e808..00cb03c)

#history: The game now stores a list of major events that happened during the game (levelling up, wishes, etc.), viewable in-game with the #history command, and in the dumplog. (Nitro, b905a92)

#loot: No longer asks you whether or not to loot the only container on the current map square; if there are multiple containers, a menu will be used. (Un and Dyna, f033f23, e3c7db5)

#offer: Now uses , to sacrifice corpses on the floor, analagously to the e, change for eating. (4, fda3342, 322aa79)

#wipe: Now mentioned by the game when it becomes useful. (Dyna, 39e2c13)

Many commands have gained additional bindings, and in a few cases lost some:

(4, 66d44c8, 79619b6, 2de7cf1, eb717fd, 2ee0dcb)

The code now always uses a menu upon pressing ? at an object prompt, rather than using the message area when there's exctly one possibility. (Nitro, 50e5cba)

It is possible to use the m/M keys to cycle between monsters when asked for a position. (Nitro and Dyna, c9737d1, b63723b)

All commands are now rebindable; they can be rebound via the keymap menu in-game (a submenu of the options menu), and these changes will be saved for future gameplay sessions. (Nitro, 411a005, dbf6cbe and others)

It is now possible to customize which commands exist as extended commands (thus, it is possible to have a command with no binding, or an extended command that also binds to a key, such as #monster/M). (Nitro, 0403969)


Stormbringer no longer automatically confirms attacks on monsters. (4, d2b6039)

Named items no longer stack with un-named items, in order to make it easier to prevent items stacking. (4, 0df7237)

Extinguishing a candle now adds it back to an existing stack of candles, if appropriate, in order to make candle use less annoying (if you need to prevent this happening, you can name the candle). (4, 0df7237)

Genocide prompts (e.g. from the scroll) now parse master mindflayer as master mind flayer, not as master. (Un and 4, C343-395, a41a65d, 8d086e4)

Boulders now render as 0 by default. (4, 5d5b740)

Thrown projectiles automatically requiver even if the quiver empties entirely, so long as they're autopickedup by means of the pickup_thrown option. (Dyna, 3b5634b, 234d32f)

Lit objects are now treated like equipped objects for the purpose of highlighting equipped objects in inventory menus. (Dyna, b999769)

To help prevent typos, inventory letter assignment now tends to steer food items away from the letters eyYnN; potions away from qyYnN; scrolls from r; wands from z; and armor, gems, rocks, balls, and chains toward these problem letters. (4, 894d615)

Walking over items now never produces a pop-up box describing them; rather, they appear in the inventory sidebar (if using a wide terminal), and a message appears ("There are a few items here", etc.) to alert the user that there are items there (perhaps propmting the user to view them using :). (Ace, 44f4c51)


Options are now stored in the appropriate user configuration directory for the system, and separately for the engine and each windowport (for instance, ~/.config/NetHack4/{NetHack,curses}.conf on Linux); they are written automatically by the game whenever the options are changed with no game loaded, rather than needing to be edited by hand. (Nitro and 4, 679b28f, deb573e..0a7fa1e, 0b6c90b..ccc0472, 8233832 and others)

Many options that previously had to be changed at compile time can now be changed at runtime (but are fixed for a given game once it has been started, i.e. are "birth options"): ELBERETH, REINCARNATION, SEDUCE. (Nitro, b84594b, bd7f641, ad88da7)

Some options (that were basically unused, that do nothing on modern systems, or were made redundant due to other changes) were removed: traditional, perm_invent (now automatically determined from terminal width), sanity_check, timed_delay, travel (redundant to keybinding), pickup_types (redundant to the new autopickup system), help, fixinv, lootabc, toptenwin, ignintr (now always false in wizard mode, true in regular play). (Nitro, 96f7c20, 3a0d9d8, 24604f9, 920cbef, bf652c4, 0453e07, 8109b2a, 7807fab, b63c1b1)

It is now possible to disable the loading of bones files for a game, using a birth option bones. (Nitro, 4bbff89)

It is now possible to increase the length of the control-P list to much higher values than in the NetHack 3 series. (Nitro, 88716d3)

A new option show_uncursed can be used to suppress the hiding of "uncursed" in situations where it's implied via knowing an item's enchantment or being a Priestess or Priest. (Bilious, 44ca3f6)

A new option comment has been added that does nothing. Its purpose is to allow a player to prove they own a server account (via setting the value of the option to a specific string), for tournament administration. (4, 4972873)


The character now remembers one of each of an item, monster, trap, etc. on a map square, rather than being limited to only remembering one of those total per map square. (Slash'EM and Nitro, fee7233, c3381e3)

The status area has been redesigned, allowing either a 3-line status area with full information shown, or a compact 2-line status area that omits some lesser-used information, giving room for HP and Pw bars (that also change color as they get lower). (Nitro and Ace, cd19816 and a13501c)

When using a large terminal, the border of the screen will change color to warn of low health and particularly pressing status effects. (4, 6c0a9a3)

The character's AC is now shown as a "Defence" value, that counts up from 0, rather than down from 10; there are currently no changes to the AC formula, it merely displays differently. (4, 25161ad)

The status area now lists many more statuses than before, such as "Levitating", and colors them appropriately. (Ace and 4, fd746b7, f9402ec, 7265bb2, aea03d3)

Instead of ASCII/IBMgraphics/DECgraphics, there are now three display modes for the map: ASCII, Unicode graphics (which will be translated to IBMgraphics via libuncursed if necessary for correct rendering on your terminal), and graphical tiles (only currently available if using the SDL backend to libuncursed). Unicode graphics can be customized via a configuration file unicode.conf, in the same place as the other configuration files, but which must be updated manually. (Nitro and 4, 2fd08d1, 14a028a, b1f8a8c, 2f4f50a, 6dd19de, 524a57f)

On sufficiently wide terminals (or sufficienly wide windows, in tiles play), a sidebar will be used to show the player's inventory and information on the current map square. (This replaces the "perm_invent" option, that used not to work in tty play anyway.) (Nitro, 39db83c, 171ff59)

On very very large terminals (large enough that the map, status area and message area have all expanded to full size), any remaining space is used to show hints about the game controls, and information about the map square under the mouse cursor (if the mouse option is on). (4, 918eec3, 7cb7397..b604352, cf03b19..4a08a7e, c4c2b2e..d20d64d, 646f9f1)

The game now understands "dark gray"/"black" as an additional color to the 14 already available (although only 7 of them were typically used); now, all 16 available colors are used by the game for rendering. (Bilious, Nitro and 4, ef6581f, 9291a95)

The terminal / game window can now be resized during the game; so long as the new size is at least 80 by 24, this will not break rendering. (Nitro and 4, a00086e, 72963ea, 625ba90, 77a94cc, 6b7506b)

A new animation option (replacing runmode) allows control of the speed at which all interruptible multi-turn actions play, not just running. For instance, when turned on, multi-turn search actions animate (with the turn counter increasing and monsters moving around being visible on the map). This is so that they can be interrupted. (4, c1d4e5b)

Many monsters (and the occasional dungeon feature) have been assigned new colors in order to make them more distinct; some monsters have also been assigned underlining to make them even more distinct, and ghosts and shades have been moved to the 'W' monster class in order to make them visible. (Ace, 2d6ee5a, ab96b14, 9681301)

The message area now shows more than one line, on a sufficiently large terminal. The extra space is used to show extra messages from this turn, in order to cut down on --More-- prompts (which are still presented if there are so many messages generated in a turn that they do not fit into the message area); if space still remains, it shows messages from previous turns, in a darker color (dark gray or blue). (4, deefc21, 4fa8192, 6825a36, 3a464dd, fc11b9d..abc1efc)

The message area (and ^P) now show which selections were made at prompts, menus, etc.. (4 and Dyna, 58295ae, 7ea9a49)

The game now tracks the player's knowledge about whether doors are locked, unlocked, and/or trapped; in console play, this is accomplished via via coloring the doors (as red, green, cyan respectively), and there is a similar indicator in tiles. (Ace, 599c3d1)

In console play, background colors are now used to show information about the game: red = "there are stairs on this square" (including under items); brown = "this monster is peaceful"; blue = "this monster is tame"; magenta = "this monster is detected"; cyan = "this square is trapped". Similar information is available in tiles play, via the use of overlays on the tiles. This is controlled by the bgbranding, hilite_pet, and use_inverse options. (4, b30c90a, a919baf)

Map squares that the player has stepped on are now drawn differently in order to communicate this fact (controllable via the floorcolor option). (4, a146d59, 5da195e)

Menus are now drawn on a screen location that aims to avoid hiding important information; for instance, the inventory menu is drawn over the inventory sidebar (if there is one), so that it does not hide the map or messages. (4, 69841a7, 4e77ee8)

Outside the Game

The game no longer exits when a game is saved or ended, allowing another game to be started or loaded. (Nitro, 3616a4c, 39db83c and others)

The death reason now records more specific information on what caused helplessness than just "while helpless". (Bilious, 7ccecee)

The game now automatically records a dumplog showing information about the game when the player ends. (Nitro, Dyna and 4, 28c01f1, 3ddd389, 5dc4448, 653784f, 00fa98f, 97fd16d)

Extinct creatures are now listed in the end-game dumps, in addition to genocided creatures. (Bilious, 594f040)

Death messages are now more precise, hopefully making unique deaths competitions more interesting; for instance, deaths such as "touching a cockatrice corpse" have been made more specific (e.g. "searching a monster's interior for a cockatrice corpse"). Additionally, portions of the death message under user control have been marked to avoid tournament parser exploits (e.g. "killed by kicking a "slime mold (with the Amulet)""). (Grunt and 4, 0128f35, e6b2994, caac7d0, c278fd2)

The game now generates an extended logfile that stores more detail about what happened in the games played on that installation (or server), for statistical and tournament scoring purposes. (Bilious, Ace and 4, 33350a2, e25fe11..b405854)

Pressing q during the "Do you want your possessions identified?" sequence now skips to the final screen with the tombstone, rather than skipping past it, avoiding the need to repeatedly press n to get to the tombstone. (4, 5925b5c)

There have been grammar improvements to death messages caused by choking on artifacts. (Grunt, 1f9636f, ef35a26)

Self-genocide while polymorphed no longer creates a corrupted tombstone. (4, C342-16, c3bdbc4)

The game executable can now connect to the Internet to receive NetHack-related announcements and (when there are no announcements available) gameplay tips. This feature will not be activated without the user's permission (it asks on the first load); even after the first load, you can control it via the networkmotd option. (4, b0786a7, 367915e)

Internals Improvements

Coding Style

Many macros have been removed, substituted into the source code (where this makes the code easier to read), or replaced with functions. (Nitro, 9bd8a54 and others)

Most conditionally compiled features have been removed from the game source, in the favour of always or never compiling them; this ensures that nobody is missing features in their game. (This does not affect gameplay, because the features that had gameplay effects were made into runtime-changeable options instead; see other changes.) (Nitro, c9663db and others)

The code now uses C89-style prototypes rather than K&R-style function definitions. (Nitro, 41fe692..6daeaee)

Many fixes to compiler warnings. (Nitro and 4, 918c516..91ab7bc, 13cf183 and others)

The coding style was made more consistent. (Nitro, a73c088, d8dbbfe)

The indentation and whitespace were made consistent across all files; previously, the code used a mix of 4-space indents, 1-tab indents, and 4-spaces-for-1-indent-1-tab-for-2-indents styles, now everything uses 4-space indents and a consistent set of rules for things like which lines to put braces on. (4, 4daa09e, 656fd82, d540858)

Dead (or mostly dead) code, constants, and variables (especially global variables) were removed. (Nitro and 4, 487ec18, b056309, 3160d45, 03367af, 088afe6 and others)

Many variables have been marked as const. (Nitro and 4, 3916bcf, 072167e and others)

The code is now almost entirely const-correct (a few exceptions still remain). (4, 0c75ca2, e622855)

The code now uses standard C functions in place of their pre-standard equivalents. (Nitro, 1b49dfb, 0f2b938)

pline is now used directly to output messages, rather than using functions like You and The for outputting strings that start with specific words and pline only in the general case. (Nitro, 6d548b7)

Instead of using static buffers to store strings, the vast majority of buffers are now dynamically allocated and have no length limit. (4, 0c75ca2, 6e90958)

All functions are now explicitly marked static or extern. (Nitro, 476bc4a)

The code now makes use of C99 and C11 features where they greatly simplify the code, or are more portable than the alternatives, so long as the compilers that we use in practice (gcc and clang) support them as extensions even outside C99 mode. (4, 9e13e1b, 1362014)

The code now makes more use of functions/macros for handling common code, rather than duplicating it. (Un and 4, 7158a54, a7f6a59 and others)

Header files no longer have dependencies that force them to be included in a specific order. (4, 122bc10)

Data Storage

Many data that are logically associated with a level (e.g. long worm information, engravings, light sources) are now stored inside the structure for that level, rather than separately. (Nitro, b78bb49, 5c2867a, 3fa2644)

Gold is now treated as an object, not a number. (Nitro and 4, 52665f1, 2894d39, 15013a8, 4a162c2)

The game no longer saves inactive levels to disk in files of their own; the binary saves hold all levels at once, and inactive levels are also stored in memory. (Nitro, 085908d)

A large number of global/static variables have been replaced via storage in a few globals that each have defined semantics for their lifetimes, with function parameters / return values, or with constants. (Nitro and 4, b854b71, f342510, d0ecdb0, cb9ed91, 1362ccd, ba8ede8 and others)

Saving data and freeing data are now separate concepts internally, considerably simplifying the code. (Nitro, bf43e08)

Migration of objects now occurs immediately, rather than being deferred until the player changes level. (Nitro, 4 and Dyna, ed8960f, aad761b, b19bd70, 2557f16 and others)

Equipment is now stored internally via a flag on items to say whether they're equipped, rather than pointers into the inventory array. This greatly reduces the chance for bugs related to forgetting to zero equipment pointers, makes the code cleaner, and makes it easier to implement equipment-related features in the future. (4, 4519fce..438f761, dc47863)

Extrinsics are now calculated when needed, rather than being dead-reckoned, making the extrinsic-handling code much simpler. (4, 730a8f6)

Equipping is now done through a centralized set of functions, in order to avoid needing special cases everywhere. (4, 7d24609, 0dbb0de)

The storage for properties of a level has been simplified. (4, 95c0482, f651183)

Light and darkness are now properties of a map square, rather than of a background; the main practical benefit of this is improved rendering of unusual dungeon features in unusual lighting conditions. (4, 3c06767, 3b11dc1)

x coordinates and y coordinates now use the same storage internally; in particular, x = 0 no longer means "off the map", because y = 0 is on the map. (4, e61bcb3, f12c528 and others)

Objects intended to exist only briefly are now allocated separately and checks occur that they do not survive for more than a turn. Additionally, venom now must be temporary and accordingly cannot be wished for. (4, b4fd8ec, 6a04b22)

Objects are now always stored on an object chain, rather than sometimes just stored on the stack or the like; this mean that any object-related memory leaks will be discovered, and that temporary objects can be correctly deallocated if the game ends while they are allocated (say, due to hangup). (4, 301962c)

The game is now capable of recovering saves automatically if something goes wrong; and it does a save and restore almost every turn to ensure that the save file can still be loaded correctly. After a save-related error, the user will have the option of automatic recovery, manual recovery (leaving the save file in place to be manually edited), or in some cases automatic repair (automatic recovery works by reloading from a backup save, automatic repair via treating impossible values as plausible legal values). (4, 41a0806, 7a3978f)

Client/Server Structure and API

The game engine has been split out into a library of its own, libnethack. (Nitro, c2771f1 and others)

The game's main loop has been restructured (and repeatedly moved between the game engine and windowports; we eventually settled on placing it in the game engine, but it's now split into a number of small functions to make it easier to follow). (Nitro and 4, b28a198, eab25d3, 0d1caed..79e72a4, 2431fac, 26a7364, cd3d8d2, ba8ede8)

The API for menu creation has been improved. (Nitro, 3da8355)

The game engine no longer cares about which commands are bound to which keys (beyond making suggestions, so that commands can be added to the engine without requiring the windowports to be immediately updated to match). (Nitro, 9124795)

The ^P command is now handled by the windowport, not the server. (Nitro, fc81b48)

The code now uses "exceptions" (actually setjmp/longjmp) for handling escape from nested contexts when things go wrong (either in terms of code errors, or for things like hangup handling), meaning that a mistake on the client does not bring the server down and vice versa. (Nitro and 4, 1a88f50, ce2b50f and others)

The game engine can now do computations "ahead" of the client, in situations where the client cannot meaningfully contribute to the game, rather than always waiting for the user to acknowledge a message before continuing; the client will nonetheless display the gamestate at the time of the message. (Nitro and 4, b7fbca6, 306911d)

The game engine and interface now both understand the concept of an argument to a game command. This made many other fixes possible. (Nitro and 4, d52dd14, 240faca, d55552b..5e8b9bf and others)

The distribution now comes with source for a game server (that links against the game engine) that allows the game engine to be on a different physical computer than the interface, and handles things like user accounts, shared bones files and so on. (Nitro and 4, f95e83d..e81e925, 7018a13 and others)

It's now possible to have a game open in more than one process at once; moves made in either will be reflected in the other. (This is useful for implementing features like watching and replaying, and is also useful if you lose a connection because you don't have to wait for the old connection to time out.) (4, f4ea0a0 and others)

It is now possible to view replays of games, and (for server play) watch live games. This can be done from the main menu, or the menu inside a game (for an "instant replay" feature, which even works inside prompts if the menu is accessed via a keybinding that isn't needed by the prompt.) (Nitro and 4, 039fc4c, de9ba8b..977fe43, 6e8fb4c..5c91a2b and others)

Error Handling

When the game malfunctions, it will now dump core on UNIXy systems (in order to ease debugging), but attempt to continue to execute anyway. (4, 2e14a0c)

The code now contains debug hooks for valgrind (not compiled by default, use -DVALGRIND_ANNOTATIONS, meaning that impossible/panic will be observable when running under that debugger). (4, 2383605)

The game can now detect a truncated save file, and automatically recover (via loading the most recent backup that remains intact). (4, 3cdad9c)

Saves and Replays

The game now uses a reproducible random number generator, and saves the seed in the save file, so that copying a save file and performing the same actions will lead to the same results. In addition to making savescumming harder, this also makes bugs easier to reproduce. (Nitro, 6728cce)

Saves and bones files are now platform-independent, allowing them to be moved from one system to another. (Nitro and 4, 756ecc9, 6a312e9)

The save file now contains an entire history of the gamestate, tracking diffs in the binary save (that represents the gamestate) from one command to the next. This means that it can be rewound (e.g. for bug reproduction and recovering broken games), and that the game can be saved just by exiting the process (meaning that games are unlikely to be lost due to segfaults, hangups, or similar situations). (4, C342-13, 9923807, 22053c2 and others)

It is now possible to save in the middle of a turn; the game tracks the choices made during the partially completed turn, and replays them upon reloading the save. (4, 5c5bf51, 5b6b996)

Packaging, Build System, and Libraries

Platform and Windowport Support

The set of supported platforms has been reduced to Linux, Mac OS X, and Windows. (Unlike NitroHack, we are not fundamentally opposed to the idea of porting the code to more platforms, such as BSD, but we currently have no way to test on them; the code may well work, but we don't know for sure.) (Nitro, ad815fc..e51ae4f and others)

All the existing windowports were removed, and replaced with a brand new windowports system, together with a single windowport, nhcurses, that forms the codebase for all currently existing windowports; there is support in the code for the addition of other windowports, but none currently exist. (Nitro, 4 and Dyna, 0bd8fa6, 39db83c and others)

A new terminal rendering library, libuncursed, is used for drawing on the terminal, and parsing input back from the user. Among other things, this supports widely portable dark gray, a better understanding of cursor keys than any library previously used with NetHack (including curses), ttyrecs that can be ported from one terminal to another correctly, a color palette that makes colors more distinct from each other, and support for both Unicode and IBMgraphics without extra interaction or configuration. libuncursed has support for UNIXy terminals generally, for the Windows console, and for rendering via a fake terminal on SDL on any platform. (4, 24b8a25..c404c3b, c8a6f31, a7828b5, 7102298, 54b1c17, 9bfb164, 0c0f5ed and others)

A tiles interface has been added via using libuncursed's tiles support. The SDL backend of libuncursed can be switched between ASCII, Unicode, and tiles in-game, rather than requiring a separate windowport for tiles and text. (4, 69eda23..1eb1244, 063cd11)

The game's tiles system is now capable of handling multiple sizes of tile, and transparent tiles, in addition to referring to tiles by name rather than number (reducing tiles-related mistakes when adding new features to the game). (Slash'EM and 4, 267b5a1..9e69e72)

The code is now written to specific levels of library support (in general, X/Open _XOPEN_SOURCE=700 and C11, although exceptions are made in some places, such as the server code), rather than the mix that had built up over the years in earlier versions. In general, this only affects the windowports; the game engine aims to be as portable as possible among C11 systems, and hardly uses platform-specific calls (although there are some exceptions, such as save file locking). (4, b85714a)

Build System

makedefs and the dungeon and level compilers now understand out-of-tree builds. (Nitro, 60480e9, 34f1e85, 6e9b16b)

A new build system, aimake version 3, is now used to build the game. This build system makes life easier for maintainers than the old Makefile-based system (because things can be rearranged internally without breaking anything), and is also much easier for players building from source, because it requires substantially less manual intervention than the old system did. (4, 2912d38 and others)