Skip to content
Tung Nguyen edited this page Jul 17, 2013 · 205 revisions

Up-to-date since commit: d343135abe - Allow spellcasting if hands are stuck to a quarterstaff

This repo is the home of my experimental changes to NitroHack. So far, I've ported most of UnNetHack up to and including the Advent Calendar branch, and have switched over to merging selected parts of NetHack4. More recent parts of UnNetHack will be ported once they've had some time to settle, e.g. Sheol, pre-fabricated vault rooms.

If you want to follow NitroHack actual, see DanielT's repo instead. See also NetHack4, which merges NitroHack and AceHack and is under continuing development.

Merged changes from GruntHack

GruntHack is a variant of NetHack that was "aiming the extend and enhance existing behaviour", at least until it was discontinued in late 2012. It's similar to Slash'EM in spirit, but rather than adding a ton of stuff, it extends what's already in NetHack. Objects can have magical properties ("short sword of fire", "rotproof chickatrice corpse"), materials ("large bone box", "dragonhide T-shirt"), be invisible and distort under hallucination. Monsters get many of the abilities previously restricted to players (e.g. player spells, water walking, displacement, strength, fumbling) and vice versa. Monsters also have vastly improved AI (pets use ranged attacks, monsters can open containers and make wishes, petrifying spellcasters cast stone-to-flesh on themselves, wandering adventurers can steal the Amulet of Yendor and ascend on the Astral Plane).

I probably won't port much from GruntHack, whose focus is on raising the stakes for both players and monsters. It does have some interesting features that wouldn't be out-of-place in other variants though.

Items

  • Magical object properties - e.g. short sword of fire, bow of detonation, cloak of magic resistance and reflection.
    • Objects with identical properties stack even if known properties differ.

Interface

  • Dynamic lighting - like darkroom, but dims everything (e.g. objects and traps) outside the field of view.

Merged changes from NetHack4

NetHack4 is a merge of NitroHack and AceHack, and focuses on playing mostly the same as classic NetHack with a modernized interface, except removing "interface screws", e.g. floating eye paralysis, Stormbringer's hostility, amnesia, renaming AC as "Defence", asking before eating a rotten corpse, walking into water or lava, or putting a dangerous item into a bag of holding.

Some of the AceHack-like changes ruin the fun of NetHack a little, so the changes that will be merged will mostly be bug fixes and pure interface improvements. See NetHack4 Omissions for the rationale of leaving out certain changes.

Gameplay

  • Light sources show fuel left if they're seen consuming it, e.g. when they flicker or go out.
    • Charging (e.g. scroll or PYEC) identifies charges as well as recharging the object.
    • Light sources are marked as cursed when they fail to light.
  • Items stack regardless of BUC knowledge.
    • Don't stack unnamed items with named items.
  • Formally identify wands when engraving gives a unique message.

Interface

  • Door coloring for trap/lock status: trapped doors appear cyan, locked doors appear red, unlocked doors appear green; controlled with the mapcolors option.
  • New hilite_peaceful option: display peaceful monsters in inverse, like pets with hilite_pet.
  • Stairs/portals get a red background, object stacks get a blue background.
    • colormap.conf: Colors used by the game can be remapped to terminal colors of the player's choice.
  • Show intrinsics, extrinsics and experience to the next level in Ctrl-X character info listing.
    • Allow viewing kills, genocides and conducts from Ctrl-X character info screen.
  • Newly displayed statuses: levitation ("Lev"), unarmed ("Unarmed"), trapped ("Trap")
  • Give monsters with overlapping appearances a unique color/underline (brighter and underlines = stronger).
  • Show messages by screenfuls with --More--.
  • Show skill slots required to raise skills that can be advanced in the #enhance menu.
  • Swapping weapons with x no longer takes time.
  • Don't say, "You climb up/down the ladder."
  • Move wand breaking from apply (a) to #invoke (V).
  • New a, shortcut for #loot.
    • Require q, to quaff from fountains and sinks.
    • Require , to select floor items when eating, tinning and sacrificing.
  • Map under cursor described when targeting locations.
  • Use more portable Unicode characters for dungeon features.
  • Populate in-game database/encyclopedia with basic item descriptions.

Bug fixes to NitroHack from NetHack4

  • Log save game diffs: Allows recovery of games and replays with corrupted log files.
  • Handle unexpected keys when targeting locations.
  • Fix message line disappearing after long message in message window.
  • Show objects and traps on the Plane of Water.
  • Wrap long messages in the message window.
  • Fix obfuscated black gems appearing yellow.
  • Disallow changing to explore mode during a game.

Bug fixes to NetHack from NetHack4

  • Fix C343-6 (You can #sit on an object at the bottom of a pit that you are not in.)

Miscellaneous

  • Make level generation independent of character experience level.
  • Fix residual "--More--" and "You die..." in message window.

Bug fixes to NetHack4 itself

  • Fix useless turn spent when autoexplore can't move the player.
  • Allow players to re-use autoexplore on levels cleared by amnesia.
  • Show "A trap blocks your way" message properly when autoexplore is blocked by a trap.
  • Prevent autoexplore treating hidden mimics like seen monsters.
  • Fix incorrectly dimmed first message in message window.
    • Fix incorrectly dimmed messages when over 40 messages appear at once.
    • Fix display of tab characters in the message window and previous message log, e.g. from the display of selections from multi-column menus.
  • Fix stray use of level inside new rloco_pos() function.
  • Fix diff log replay desync warning due to static timer_id in timeout.c.
    • Save and restore u.ubirthday to fix replay desyncs when rewinding (NetHack4 only fixes this when resuming a game).
    • Increase zlib compression level for binary blobs in logs.
      • Link zlib with game library to fix OS X build failure (Marco Bonetti).
  • Fix lock-up in history message clearing when replays try to recover from desyncs.
  • Fix description of objects and traps on the Plane of Water.

Progress of UnNetHack port

In general, all code that references UnNetHack changesets is credited to Patric Mueller, and anything else is my original work, unless otherwise stated.

See Omitted Changesets for what's been left out, e.g. externalities like livelogging and mail are omitted since they're hard to test and NitroHack's new architecture might have better solutions anyway.

Levels

  • Dungeons of Doom
    • New Advent Calendar branch: closets with prizes from December 1 to December 24.
    • New Minetown map: Orcish Town, barred off, has a lot of orcs.
    • 27 new Sokoban puzzles.
      • Sokoban luck penalties removed
        • Scrolls of earth on first Sokoban level removed.
      • Sokoban is now 3 floors (was 4); maps of the first 2 levels have been combined into a single pool.
      • New choice of 1 of 3 random Sokoban prizes.
        • Sokoban prizes are colored bright magenta before they're picked up.
    • New Town branch: entrance below Sokoban, goes upwards past open level with random rivers, has stores at the end.
    • 6 new Big Room maps.
      • Spare candles added.
      • Big rooms may occasionally have different terrain.
    • 2 new Fort Ludios maps.
    • New Black Market branch: accessed via a hidden portal, contains a huge store with huge prices.
      • Scrolls of earth are half as effective in the Black Market.
    • 2 new Medusa's Island maps.
    • 2 new Castle maps.
    • Level teleporting past the Valley of the Dead puts you in the Valley instead of level teleporting randomly.
  • Gehennom
    • Heck^2: 40 hand-designed levels for Gehennom mazes, 1-8 used per game, mazes mixed with caverns.
      • Gehennom mazes may be replaced by rivers and lava caves.
      • 1 new map for the Valley of the Dead.
      • 1 new map for Asmodeus' Lair.
      • 1 new map for Baalzebub's Lair.
      • 1 new map for Orcus-town.
        • Orcus-town now has abandoned lighting shops with candles.
    • New Dragon Caves branch: consists of 4 new special levels filled with dragons, worms, treasure and new terrain
    • Vlad's Tower contains less items (note: 50% chance of amulet of life saving and 60% chance of boots of water walking to be found).
    • Moloch's Sanctum redesigned: now has lava, iron bars and drawbridges.
  • Special levels may be flipped horizontally and/or vertically.
    • Number of monsters, objects and traps on many special levels randomized.
  • Elemental Planes occur in random order.
  • New Garden room: nymphs, trees and fountains.
  • New Dilapidated Armory rooms: rust monsters, brown puddings and damaged weapons and armors.
  • New Nymph level: has nothing but nymphs, Aphrodite, occurs in 45% of games.
  • Quest levels for the new convict role.
  • Tin shops, instrument shops and pet stores.
  • Muddy swamps: like pools of water, but makes anything that walks into them get stuck, mud boots help.
  • Doors no longer resist opening, i.e. no more "The door resists!"
  • Inaccessible niches may occasionally have iron bars.
  • Some walls on normal levels replaced with iron bars.
  • Secret corridors no longer appear in randomly-generated levels.

Monsters

  • New monsters
    • Gold dragons, whose scales emit light and are stoning resistant.
    • Chromatic dragons: resist nearly everything, has random breath attack, drops chromatic dragon scales.
      • Caveman quest nemesis is now Tiamat.
    • Snow ants: like fire ants, but cold.
    • Vorpal jabberwock: Four 3d10 attacks, with 1/40 chance to decapitate anything with a head.
    • Disintegrator: A Gehennom-only slow 'R' that disintegrates armor, and instakills without armor.
    • Aphrodite: a high-level nymph generated on the new Nymph level.
    • Cthulhu: a very powerful mind flayer-like unique monster, now holds the Amulet of Yendor.
    • Anti-matter vortex: a fast vortex that disintegrates when it engulfs; spits you out if armor was disintegrated. Removed.
    • Mugger: appears in the new Town branch, has a stealing attack.
    • One-eyed Sam: Black Market shopkeeper, wields Thiefbane, resists being teleported far away, angered by conflict.
    • Giant turtle: Blocks field-of-view, tins always provide 200 nutrition.
    • Wax golem: emits light, has fiery attack, drops wax candles when destroyed.
    • Locust: HD 9, has a sickness-causing sting attack, appears in small groups.
    • Enormous rat and rodent of unusual size: grown forms for sewer rats and giant rats.
    • Inmate, miner, prison guard, lava demon: appear in the convict quest
    • Robert the Lifer: convict quest leader
    • Warden Arianna: convict quest nemesis
  • Randomized dragon appearances: dragons have random appearances in each game.
    • New dragon appearances: tatzelworm, amphitere, draken, lindworm, sarkany, sirrush, wyvern, guivre.
    • Identified dragon armor powers/names: magic, reflecting, fire, ice, sleep, disintegration, electric, poison, stone, acid.
      • You cannot wish for dragon armor by power until it has been formally identified, i.e. it appears in the discoveries list.
      • Identifying dragon scales also identifies the matching scale mail.
  • Chromatic dragon scales and scale mail: grants reflection and resistance to fire, cold, sleep, disintegration, shock, poison, acid and petrification, and can't be wished for.
  • The Chromatic Dragon (Caveman quest nemesis) renamed to Tiamat and has 17 hit dice (was 16).
  • The following monsters now ignore Elbereth
    • Quest nemeses
    • Unique demons
    • Vlad the Impaler
  • Minotaurs now respect Elbereth and scrolls of scare monster.
  • Riders, angered quest leaders and One-Eyed Sam can smash boulders.
  • (Master) mind flayers no longer cause amnesia (but still drain intelligence).
  • Vlad the Impaler is a much tougher fighter.
  • Monster HP now based on size; small monsters have less, large monsters have more.
    • Riders now have 108-164 HP, instead of 10-80 HP.
  • Juiblex takes 1/2 his current hit points in damage when zapped with a wand of digging from within.
  • Demon prince bribe amount raised.
  • Killing the Wizard of Yendor raises the difficulty of spawned monsters.
  • Uniques no longer attack other uniques to get the Amulet of Yendor.
  • Hallucination protects against Medusa's petrifying gaze.
  • Pudding farming prevented by reducing 1/2 max HP when split and no longer leaving death drops.
  • Cancelled trolls no longer revive.
  • Vampires can drain blood when biting, feeding them a bit.
    • Vampires can drain blood from corpses, feeding them (from SLASH'EM).
  • Corpses can be oily, causing your fingers to become slippery 1 in 5 times they are eaten. Oily corpses include all blobs, amorphous (can flow under doors) and slithy monsters (has a serpent body), except snakes, nagas and mimics.
  • Floating eyes are now bright green instead of dark blue.
  • Gnomes sometimes carry candles.
  • Monsters may fight other monsters of their own accord, e.g. elves and orcs, angels and demons (Grudge patch).
  • Horned devil is now red (was brown).
  • Many uniques now have stocked inventories
    • Lord Carnavon: +5 fedora, random +4 weapon, 3 random objects
    • The Minion of Huhetotl: 3 random cursed objects
    • Thoth Amon: random +2 weapon, random armor, 3 random objects
    • Shaman Karnov: random +6 armor, random +6 weapon
    • The Chromatic Dragon: 5 random objects
    • Hippocrates: 4 random wands, 2 random scrolls, +4 silver dagger
    • Cyclops: random +3 armor
    • King Arthur: +4 long sword, random +3 armor
    • Ixoth: 2 random scrolls
    • The Arch Priest: +4 robe, 4 random scrolls, 2 random spellbooks
    • Nalzok: random +6 weapon, random +3 armor
    • Orion: +4 leather armor, +4 yumi, 50 +4 arrows
    • Scorpius: 6 random objects
    • The Master of Thieves: random armor, random weapon, 4 random potions
    • The Master Assassin: random armor, random weapon, random scroll, random potion
    • Lord Sato: +4 splint mail, +4 katana, random scroll
    • Ashikaga Takauji: splint mail
    • Twoflower: 6 random objects
    • Norn: random armor, random weapon, 2 random scrolls
    • Lord Surtur: random armor, random weapon, 2 random objects
    • Neferet the Green: 2 random wands, 2 random scrolls, random armor
    • The Dark One: random wand, random scroll, random spellbook, random armor
    • Croesus: two-handed sword, random armor

Items

  • New items
    • Iron safe: container, can be opened with a stethoscope.
    • Thiefbane: artifact two-handed sword, generated with the Black Market shopkeeper, has a 10% chance to decapitate, can't be wished for.
    • Rings of gain intelligence, wisdom and dexterity (from SLASH'EM).
    • Tinfoil hat: blocks telepathy and clairvoyance, greatly hinders spellcasting, protects against monster psi-bolts and psychic blasts, has 90% chance to be generated cursed.
    • Potion of blood: always "blood-red", generated on vampires, converts lawful/neutral altars to chaotic, makes you vomit when drunk, clears to water with a unicorn horn.
    • Potion of vampire blood: like blood, but also generated on higher-level vampires, feeds (and if blessed also heals) vampires, polymorphs you into a vampire if drunk and cancels to blood.
    • Scroll of flood: creates pools of water around you, replaces the scroll of amnesia.
    • Striped shirt: never randomly generated, shopkeeper bans (and remembers ban) if attempting to enter shop while wearing it uncovered.
    • Luck Blade: intelligent chaotic artifact broadsword, +d5 to-hit, +d6 damage vs. all monsters, acts like a luckstone, first sacrifice gift for convicts.
    • The Iron Ball of Liberation: intelligent neutral artifact heavy iron ball, weighs 300, rustproof (convicts only), grants magic resistance, displacement, automatic searching, invokable phasing for 51 to 150 turns, unchains other heavy iron balls, convict quest artifact.
  • Changes to the Amulet of Yendor
    • Cthulhu now holds the Amulet of Yendor.
    • Amulet of Yendor may teleport when dropped.
    • Astral Escape: invoking the Amulet of Yendor on a high altar on the Astral Plane gives you different endings.
      • Sacrificing the Amulet of Yendor breaks atheist conduct; successful atheists are warned before they do this.
    • The 'mysterious force' is replaced with no-teleport when carrying the Amulet of Yendor.
  • The Banes are improved
    • The Banes have a 1 in 6 chance to cancel their target monster.
    • The Banes warn of their target monsters.
    • Demonbane protects the wielder against demon summoning.
    • Trollsbane grants hungerless regeneration.
    • Giantslayer grants 18/** minimum strength and +7 to damage when wielded.
  • Two-handed weapons double strength damage bonus (which is typically -1 to +6).
  • Dropping a container on an altar BUC-tests its contents as well.
  • Unknown item details shown in square brackets at the end of the game (DYWYPISI patch).
  • Magicbane no longer cancels monster inventory items.
  • Monsters can pick up and use wands of cancellation against the player, cancelling a random item, and vice versa.
    • Cancelled dragon scale mail reverts to dragon scales.
    • Being cancelled now shows a message.
  • Vorpal Blade does +1d8 bonus damage against all monsters.
  • Dragon scales now give 1 AC (was 3) and dragon scale mails now give 5 AC (was 9).
  • Magic markers get less charges: 20-80 versus 30-100.
  • Blessed crystal balls are easier to use (d13 int check versus d20).
  • Wands of wishing grant less wishes: 17% (1:0), 66% (1:1) and 17% (1:2) recharges and charges respectively.
  • Shields of reflection are no longer magical and now weigh 75 (they were previously 50).
  • Unicorn horns no longer restore lost attributes.
  • Throne wishes are replaced with restoration of lost attributes.
  • Potion of gain ability now tries only 3 times (vs. 6) when uncursed; blessed tries 1000 times but raises only one attribute (vs. all of them).
  • Cursed amulets of life saving fail 1 in 4 times.
  • Scrolls of genocide nerfed: blessed scrolls wipe out a single monster from the whole dungeon, uncursed scrolls wipe them out from the current level.
  • Cursed objects may hit the ceiling and fall back down.
  • A cursed wand has 1/30 chance to blow up when zapped, versus 1/100.
  • Rings of teleportation, polymorph and polymorph control have new effects when dropped down sinks.
    • Rings dropped down a sink are auto-ID'd when they give an identifying message.
  • Ring of regeneration identifies itself if worn while injured.
  • More items can be read: gold, tins, cans of grease, candy bars, credit cards, magic markers, the Orb of Fate, runeswords, runed broadswords and runed daggers.
  • The Heart of Ahriman grants displacement and increased power regeneration, instead of stealth.
  • Unpaid items filter added to container loot menus.
  • An exploding bag of holding scatters its contents instead of destroying them.
  • A bag of tricks has about a 1 in 4 chance to do something interesting when applied. When it does...
    • 2/9 spits out a random item (of weight 100 or more)
    • 1/9 wriggles away from you
    • 1/9 tries to pull you in, paralyzing you for d4 turns
    • 1/9 blows out a stinking cloud
    • 1/9 hallucinates you for d35 + 10 turns
    • 1/9 yells "Boo!" scaring away nearby monsters and possibly yourself too
    • 1/9 grows teeth and bites, like when looted
    • 1/9 licks your wielded weapon out of your hand
  • Completely eroded armor is destroyed.
  • Amulet of unchanging can no longer be polymorphed.
  • Scroll of earth now hits solid swallowing monsters when read while engulfed.
  • Bonus +1 AC for every piece of race-matching armor worn.
  • Stethoscopes applied to eggs on the ground can identify what's inside.

Gameplay

  • Autoexplore: press 'v' to automatically explore a level, interrupts for interesting things; ported from NetHack4, with improvements from UnNetHack:
    • Tell player if level is only partly explored if some places are unreachable by autoexplore.
    • Autoexplore prioritizes items over unexplored areas.
    • Autoexplore interrupts when finding a shop.
      • Autoexplore visits items specifically in the Black Market.
  • Tutorial Mode: starting option for new players; gives help messages with gameplay basics for in-game events.
  • New playable Vampire race: strong, can regenerate, fly, must feed on blood from monsters and corpses.
  • New playable Convict role: starts with cursed striped shirt, ball and chain (uses/trains flail skill), pet rat, immune to sickness, guards and watchmen always hostile, banned from shops if shopkeeper sees striped shirt, starts with no food but lasts longer while hungry.
  • Color Alchemy: potions now mix based on color and brightness.
    • Alchemic blasts do less damage to acid resistant characters.
    • Litmus: Potions can be tested for acid by dipping a lichen corpse into them.
  • paranoid_hit and paranoid_quit options: require full 'yes' for hitting peacefuls or quitting.
    • paranoid_trap option: ask before stepping onto a known trap.
    • paranoid_lava and paranoid_water options: stop the player from walking into known lava or water (default on).
  • Autopickup now leaves items deliberately dropped by the player; new pickup_dropped option restores old behavior.
  • darkroom option: darken out-of-sight spaces (default on).
  • autounlock (default on) asks to use unlocking tool when trying to open a locked door or container.
    • Autounlock #loots containers after unlocking.
  • Ctrl-E engraves "Elbereth" in the dust with your fingers, or with a wielded athame.
    • Newly displayed status: standing on an active "Elbereth" engraving ("Elbereth").
  • spellorder option: change order of letters used in spell menus and set spell letters.
  • msgtype option: filter, pause for input or hide repeated messages by pattern.
  • pilesize option: set minimum number of objects before "things that are here" dialog is hidden.
  • hp_notify and hp_notify_format options: show a message when HP changes between turns.
  • Pressing a command key at a direction prompt repeats the last direction, e.g. ff fires in the last direction.
  • Quest now only requires you to be experience level 10 (was 14).
    • Angered quest leaders can now be killed to unlock the quest stairs.
  • Multi-turn actions stopped if hit points or magic energy is restored.
  • Instant death from poison replaced with damage to maximum hit points.
  • Hide the Riders' names from afar on the Astral Plane.
    • Co-aligned temples on the Astral Plane no longer scare away monsters.
  • Scrolls of gold detection read confused detect a random item class.
    • Cursed scrolls detect traps, except in the end game.
  • Scrolls of magic mapping reveal secret doors if not cursed, and objects if blessed.
  • Cheap shopkeepers always alter buy/sell prices, so shopkeeper prices in a store are always constant.
  • Drawbridge closing blocks 1 in 5 times.
    • Huge monsters block the drawbridge from closing.
  • Less score given for killing the same monster type repeatedly.
  • Several more random wand/ring appearances are fragile.
    • Fragile rings may break if thrown, dropped or struck with force on the floor/in a container.
  • Weaker wishes from magic lamps, smoky potions and fountains: can't grant wishes for magical items.
    • Magic lamps can now be wished for from wands of wishing, and may come from polymorphing items.
    • Number of wishes of magical items is tracked like other conducts.
  • Unskilled weapon use caps to-hit rolls at 15 instead of 20 (from SporkHack).
  • Dungeon growths by Pasi Kallinen:
    • Trees may grow near other trees.
    • Trees may drop fruits and leaves.
    • Herbs on the ground or in the water may grow more herbs.
  • Exotic Pets: Cavemen, rangers, rogues and tourists may start with new, exotic pets.
  • Throwing weapons at unskilled or restricted may slip 1 in 5 times.
    • Cursed and greased throwing weapons slip more often.
  • Wishes can no longer accidentally cancelled with escape.
  • Fighting now creates noise, waking up nearby sleeping monsters.
  • Skills require more 'hits' to advance
    • Basic - 100 (was 20)
    • Skilled - 200 (was 80)
    • Expert - 400 (was 180)
    • Master - 800 (was 320)
    • Grand master - 1600 (was 500)
  • Some items randomly removed from bones: 1 in 5 if less than 50, else keep only 50 on average.
  • Vibrating Square now prints messages when nearby.
  • Level teleport is random if the chosen level is outside the bounds of the current dungeon branch.
  • Chat skips its direction prompt if there's only one adjacent creature; can be disabled with the paranoid_chat option.
  • Loot skips its confirmation prompt if standing on only one container; can be disabled with the paranoid_loot option.
  • Extended Conducts: Set birth options for characters prepared to follow chosen conducts, track more conducts (foodless, atheist, illiterate, pacifist, sadist, nudist, master thief, vegetarian, vegan, zen) and record successful conducts in the high score list.
    • Number of times Elbereth is engraved is tracked.
    • Number of bones levels encountered is tracked.
    • Racial armor conduct: wear only armor of your character's race.
    • Sokoban "rule" breaking tracked as a new conduct.
  • lit_corridor, show_uncursed, hilite_pet and standout options enabled by default; pickup_burden set to burdened by default.
  • Piles of items on the floor are shown in inverse video to tell them apart from single items.
  • Auto-travelling automatically opens doors too.
  • Up to five bones can be left for a level at a time, one of which may be chosen per game.
  • Spells 1000 turns or less away from being forgotten marked with ! in spell menus.
  • Levels can be annotated from the call/naming menu.
    • Current level annotation shown when restoring a game.
  • Spells and wands of digging are no longer restricted to digging a single block of wall/stone on maze levels.
  • Object menus consider object quantities when selecting with a count.

Miscellaneous

  • Dump log (in NitroHack and UnNetHack, but new to NetHack) shows more last messages and compacts repeated lines.
  • Many random engravings and hallucinated monsters from UnNetHack, NAO, SLASH'EM.
  • Random themed engravings for some levels.
  • Death talks in CAPITAL LETTERS.
  • YAFMs for death of pets named "Kenny".
  • Many, many more object descriptions: more than double the number in NetHack.
  • Indiana Jones YAFMs for archaeologists.
  • New database/encyclopedia entries (from SLASH'EM).
  • "mindflayer" (no space) supported as an alternate spelling for "mind flayer", so monks no longer need to worry about accidentally genociding themselves when genociding "master mindflayers".
  • Pi Day: on March 14, cream pies get a different name and YAFM when they're thrown and hit you.
    • Pi Day effects work on Pi Approximation Day (July 22).
  • Towel Day: on May 25, all characters start with a towel.
  • "helmet of opposite alignment" is understood by the game as the helm of opposite alignment.
  • "crystal orb" is understood by the game as a crystal ball.
  • Breaking a camera may release the picture-painting demon inside.
  • YAFM for trying to put a bag of holding in itself.
  • Name of the creator deity is now randomized.
  • YAFM for playing a magic flute while hallucinated.
  • Szechuan tins give you a free fortune cookie.
  • 1 in 100 kittens the player starts with gets a special name.
  • Falling down holes or trapdoors give different messages depending how far the player falls.
  • Niches blocked with iron bars sometimes have corpses behind them.
  • Trees struck with death may become dead trees.
  • Player gets fictional currencies instead of zorkmids when hallucinating.
  • YAFM for extincted species list on April Fool's Day.
  • Vampires and elves greeted specially by shopkeepers.

NetHack bug fixes (not already in NitroHack)

  • Fix bug in travel moving player back and forth for hundreds of turns until fainting from hunger.
  • Fix monsters getting stuck when fleeing in a corridor.
  • SC343-11, SC343-12: Astral Call bug.
  • S343-2: 1x1 room in special level can trigger panic due to off by one error.
  • Fix Book of the Dead being destroyed when player walks into lava.
  • Fix the existing fix for C343-235 (Casting spell of protection gives incorrect message if hero is swallowed or in rock) by correcting the check for the player's position.
  • Allow spiked pits to be entered with > like pits, to go with the existing fix to C343-12.
    • Going down in a pit with > when wielding a digging tool autodigs a hole (autodigdown option).
    • Fix poor grammar when items dropped while blind over pits tumble down.
  • Fix crashes with naming and dipping prompts with objects with long (80+ character) class names and individual names.
  • Correct spelling errors in quest lines.
  • Artifact naming exploit fixed.
  • Hard-coded player placement when taking stairs from the Valley to the Castle removed.
  • Weapons that behead or drain life will now do so when wielded by a monster and used against another.
  • Fix spacing of angry shopkeeper price quotes ("For you, scum ; ..." becomes "For you, scum; ...").
  • Fix death in shop mentioning wrong/no shopkeeper on a level with multiple shopkeepers.
  • Fix objects on bill of one shopkeeper marked paid when angering another shopkeeper.
  • Replace comestible age check against its BUC status with a value based on its BUC status.
  • Make nurses heal the character if they're wielding a non-weapon object, consistent with the "relax" message they give when chatted to in the same circumstances.
  • Fix wielded potions of blindness conferring resistance to blindness from certain sources, e.g. yellow lights, archon gazes (found and fixed by arxanas).
  • Fix mimics in a form blocking sight still doing so after being genocided.
  • Fix seeing past a stack of boulders when one of them is picked up by a monster.
  • Fix use of "dungeon" in drum of earthquake message on certain levels.
  • Fix putting rolling boulder traps on lava.
  • Fix buffer overflow in call prompt's query with objects with very long (80+ character) name and type name.
  • Fix error message when offering non-zero gold in a bribe while carrying zero gold when GOLDOBJ is defined.
  • Fix four crashes when makemon() returns NULL.
  • Prevent creation of monsters flagged "never randomly generated" (i.e. G_NOGEN) when special levels make monsters by class. (This caused e.g. chromatic dragons to randomly appear on variants of the Castle in UnNetHack.)
  • Fix scumming clairvoyance mapping by restoring or wall-walking on turns divisible by 15 (could cause log replay deviation in NitroHack).

UnNetHack bug fixes (not already in UnNetHack)

  • Convict bug fixes:
    • Add monster generation override info to convict quest levels.
    • Fix intrinsic phasing not permitted diagonal movement through stone or diagonal gaps.
    • Fix punishment sometimes failing to attach the Iron Ball of Liberation if other heavy iron balls are in the inventory.
    • Fix zero-turn soothing of rats when chatting to them.
    • Replace Iron Ball of Liberation weight/rustproof kludge when it's touched to when the artifact is christened.
    • Allow characters wearing a striped shirt to enter the Black Market.
    • Use random creator god name in convict legacy text instead of Marduk.
    • Move "... yells:" out of the double quotes of verbalized messages of angered guards and watchmen.
  • Fix freeze when Cthulhu tries to revive on a filled level.
  • Fix potential freeze if create_trap() tries to make a trap in a room completely occupied with stairs and/or ladders.
  • Let One-eyed Sam use Thiefbane (two-handed sword) by swapping his shield of reflection for an amulet of reflection, and his amulet of life saving with a potion of full healing. Never mind, Thiefbane can be specially-equipped by One-eyed Sam, even if she is wearing a shield.
    • One-eyed Sam can wield a shield even when wielding Thiefbane.
  • Dropping a container on an altar and learning the BUC of its contents merges redundant stacks.
  • Fix dimming of surrounding spaces when searching a lit room while blind with dark_room disabled.
  • Fix giant turtles blocking sight after being genocided.
  • Level genocide works on chameleons the same way it does with dungeon-wide genocide, i.e. genociding chameleons kills them in whatever form they are, while genociding their form forces them into another form.
  • Tutorial Mode tracks diagonal movement properly, so a reminder is only shown if it isn't used for a while.
  • Fix two excluded Sokoban bottom levels when levels were ported from GruntHack.
  • Remove extra amulets in Vlad's Tower now that container IF statements in level descriptions have been fixed.
  • The hard-coding of inventories of Dispater, Yeenoghu and Cthulhu have been removed.
  • Final Caveman quest level uses "Tiamat" instead of "Chromatic Dragon".
  • Extended Conducts: illiterate characters cannot read coins, magic markers and other items for flavor text.
  • Extended Conducts: master thief conduct checks for Cthulhu instead of the High Priest of Moloch.
  • Extended Conducts: fix multi-counting worn-armor conduct when restoring a game.
  • labelread: Read fictional currencies when hallucinated.
  • "baby grey dragon" (with an 'e') is interpreted correctly at prompts.
  • BLACK_DRAGON_SCALE_MA is defined with its last two letters (IL).
  • randline_detail in lev_comp.y forgets a trailing semicolon.
  • FIXME to free function opcodes in level compiler actually fixed.
  • add_opcode() now uses realloc().
  • Replace "unbelievable" with "unbelievably" in "You keep falling down an unbelievable deep shaft!" and "You are falling down an unbelievable deep shaft!" when falling down a hole or trap door.
  • Suppress prompt with paranoid_trap option when running or travelling takes the player to a trap; interrupt the running/travelling instead like when the option is disabled.
  • Map branch stairs when entering special levels marked premapped, e.g. when levelporting to the first Sokoban level in wizard mode.
  • Fix grammar of name prompt query when fallback is used in the case of overly-long name and type name.

For developers

  • Brand new byte-code based special level compiler by Pasi Kallinen.
    • User:Paxed/unnethack.des - summarizes the bulk of the changes here, plus new changes that haven't landed in this branch yet.
    • Raw dumps of level-building structs replaced by explicit values and a stack for them.
    • lev_comp program now takes -v for verbose output to show output levels and number of opcodes.
      • New -d option to dump plain-text opcodes of levels to files.
      • Maximum level filename length raised to 14 characters (was 8).
    • New rooms wizard mode command: shows rooms and shared boundaries for current level.
    • New mazewalkmap wizard mode command: view mazewalk paths for the current level.
    • New feature: terrain selections; custom areas of the level that coordinates can be chosen from, or have terrain changed en masse.
      • floodfill(x,y) for contiguous area containing (x,y) e.g. to fill Rogue quest entry level streets with monsters.
      • & binary operator to combine selections with logical OR
      • filter(sel1, sel2) to intersect selections with logical AND
    • Support for $variables with basic types:
      • string and integer
      • coord: (3,4)
      • region: (1,2,8,9)
      • mapchar: 'P' or ('P', lit)
      • monst(er): 'L', "demilich", ('L', "demilich") or random
      • obj(ect): '?', "genocide", ('?', "genocide") or random
    • Support for arrays: just assign any comma-delimited brace-enclosed list to a variable.
      • Monster arrays need MONSTER: before the braces, object arrays need OBJECT:.
      • New SHUFFLE statement, SHUFFLE: $your_array randomly orders the contents of $your_array.
        • RANDOM_OBJECTS, RANDOM_PLACES and RANDOM_MONSTERS removed, since arrays and SHUFFLE do exactly the same thing.
    • Support for integer math expressions: +, -, *, / and %.
      • . (period) concatenates strings.
    • Support for dice notation for random integer values, e.g. 3d5 rolls 3 dice with 5-sides when the special level is created in a game.
    • Basic functions: define with FUNCTION myfunc() { stuff }, call with myfunc().
      • Funtions can be included from other DES files like so: INCLUDE "functions.des"
    • IF conditions.
    • SWITCH statement, takes a number n, picks CASE (or DEFAULT) from 0 to n - 1 and falls through until BREAK.
    • LOOP statement, repeats its body n times.
    • Level statements (including control flow) work in containers and monster inventories.
    • Curly braces used for rooms, subrooms and IF conditions.
    • New terrain command.
    • New EXIT command.
    • 'x' acts as a transparent map tile.
    • 't' places a dead tree.
    • 'M' places a muddy swamp.
    • Blood engravings can now be set by special levels.
    • New level flags noflip, noflipx and noflipy to stop level flipping.
      • New level flag stormy for thunder and lightning effects of the Plane of Air.
      • New level flag graveyard to reduce undead corpses generated.
      • New level flag sky for levels with open sky instead of ceiling.
    • New MON_GENERATION statement, overrides normal monster generation, e.g. MON_GENERATION: 86%, (80,'S'), (16,"human mummy"), (4,'M') overrides 86% of the time to create S/human mummy/M in a 80/16/4 ratio.
    • New SOUNDS statement, sets level sounds, e.g. SOUNDS: 500, (hear, "slithering."), (feel, "a breeze") displays either "You hear slithering." or "You feel a breeze." 1 in every 500 turns; verbal and pline also supported.
    • New RANDLINE command: draws a line of terrain between two coords with a given thickness and roughness.
    • New GRAVE command: engraving can be set to random, a specific message or left blank.
    • New WALLWALK command: lines inside of a room with e.g. lava or water.
    • RANDOM_CORRIDORS can now use new room-corridor connection algorithms (optional argument):
      • 0 or no argument: NetHack default.
      • 1: Connect each room to a random other room.
      • 2: Circular connection: room1 -> room2 -> room3 -> ... -> room1.
      • 3: Star connection: one room connects to all other rooms.
      • random: One of the above, chosen randomly.
    • MAZEWALK command can optionally omit loot generation.
      • MAZEWALK can draw with any map char.
    • Comments now allow whitespace before them on the line.
    • LEVEL replaces MAZE; mazelevel level flag used to set mazes.
    • INIT_MAP sets initial map fill to one of solidfill (can be lit), mazegrid or mines.
    • ROOMDOOR can set multiple wall directions, separated with pipe characters.
      • DOOR can now be set to secret.
    • New level flag premapped for Sokoban-style mapping.
    • New level flag shroud to disable hero map memory for the level.
    • Better map char error detection and messages.
    • CONTAINER now takes contents with braces; objects are no longer marked contained.
    • MONSTER and OBJECT accept more of their parameters optionally.
      • MONSTER names now require NAME: before them.
      • MONSTER can optionally have inventories (same syntax as containers).
    • More optional parameters for MONSTER
      • female
      • cancelled
      • revived (dropped items on death less likely)
      • avenge (pre-angered and thus safe to hit)
      • fleeing:n (for 0 <= n <= 127 turns)
      • blinded:n (for 0 <= n <= 127 turns)
      • stunned
      • confused
      • seen_traps:x (x is all or pipe-delimited trap names the monster has seen)
    • More optional parameters for OBJECT
      • quantity:n (stack size)
      • buried
      • lit
      • erodeproof or eroded:n (1-15 is erosion level)
      • locked or broken (for containers, latter means broken lock)
      • trapped (for containers)
      • recharged:n (number of times recharged)
      • invisible
      • greased
    • ROOM and SUBROOM are no longer linked by name.
    • Room type chances no longer use CHANCE:, but instead use a percentage, e.g. "shop" [50%].
    • WALLIFY can take an optional level region argument.
    • Permanent REGION can optionally take brace-enclosed level commands.
    • Lit state for terrain-changing statements is now optional; to use it, put it after a comma and the terrain character in parentheses.
  • DLB tool now fails hard when it gets too many files; file limit increased.
  • Like NitroHack, builds are warning-free.
  • Wizard mode shows map position in attributes screen.
    • Wizard mode shows hunger level in attributes screen.
  • New warning function: like impossible but for less critical situations.
  • SHOPTYPE environment variable is back; set it and play in wizard mode to test generation of certain rooms.

Changes to NitroHack

On top of what's ported from UnNetHack, I've also made some changes to NitroHack itself.

Original features

  • Builds and runs in Windows using Cygwin.
    • Native Windows support using MinGW, i.e. standalone with no special dependencies or requirements.
  • More interesting dungeon generation
    • Split rooms occasionally generated in the dungeon, and actually work.
    • Star and circle corridor styles are occasionally used and look better.
    • Pool rooms generated: room lined with lava/water (but very rare!)
    • Sokoban levels are no longer flipped.
  • Thematic colors for special map regions (can be toggled with the new mapcolors option, inspired by L's Coloured Walls and Floor patch).
    • Altars are white/gray/black/red for lawful/neutral/chaotic/unaligned.
      • Altars on the Astral Plane are bright magenta.
    • Gnomish Mines has brown walls, except for room walls.
    • Sokoban has bright blue walls.
    • Beehives have yellow walls and floor.
    • Valley of the Dead is entirely in grayscale (different to the Rogue level).
    • Gehennom has orange walls.
      • Juiblex's Lair has bright green floor.
      • Wizard's Tower has magenta walls.
  • Options menu improvements
    • All options bring up a prompt; no more accidental option changes.
    • Option values moved next to names (description now on far right), making them much easier to check.
    • Boolean and enum options show description and current setting.
    • Autopickup and msgtype rules scroll to bottom when adding a new rule.
  • Inventory object action menu improvements
    • Shorter menu items.
    • Mnemonic accelerators for actions.
    • Action menus supported in partial inventory listings (the I command).
    • Object description and weight used for menu title.
    • Add action to view more info about an inventory object.
    • Add action to pay for an unpaid inventory object.
    • Add action to name an object/call object type.
    • Add action to unwield currently wielded object.
    • Add actions to swap and two-weapon for wielded/alternate weapons. The menus are long enough without these.
    • Add action to adjust the inventory letter of an object.
    • Show "throw (fire)" when object would be fired if thrown.
  • Travel and autoexplore no longer interrupt themselves when pets stand in the way.
    • Running/travel/autoexplore is stopped when getting hungry or weak.
    • Running/travel/autoexplore is stopped when becoming confused or stunned.
    • Running/travel/autoexplore continue even if hit points or magic energy is restored.
    • Travel in Sokoban no longer tries to lead the player through boulders.
    • Running/travel/autoexplore do not bring up autounlock prompt.
    • Autoexplore favors room spaces.
    • Autoexplore moves to and stops for stairs and dungeon features.
    • Autoexplore leads players back to thrown/fired objects.
    • Autoexplore ignores statues.
    • Muddy swamps get a message when they block autoexplore.
    • Autoexplore leads players into closed doors less often.
    • Travel/autoexplore try to go around peaceful monsters and monsters with no active attacks.
    • Autoexplore is disabled when weak from hunger
    • Autoexplore no longer leads the player to a random corridor corner when finishing a level.
    • Autoexplore skips previously-explored and unchanged objects and object piles.
    • Travel no longer stops for visited engravings or gravestones.
    • ^ shortcut for traps and magic portals while targeting.
  • Hit point bar and status colors for compact (classic) status lines.
    • Attributes color green/red on change.
    • Turn count changes color depending on the number of turns since input.
    • Frames change color when hit points are low.
  • Status display of inventory weight, burden limit and used inventory slot count.
  • Turns used by multi-move actions shown as messages, e.g. "You finish your dressing maneuver. [6 turns]"; can be tuned/toggled with the new delay_msg option.
  • New safe_peaceful option: replaces confirm option, prevents hitting peaceful monsters without a prompt (yes, default), with a prompt (ask) or hits indiscriminately (no).
  • sparkle option changed into a number that controls the speed of or disables the magic-resisting animation (from K-Mod).
  • paranoid_trap suppresses its prompt for traps that won't affect the character.
  • Objects picked up with pickup_thrown fill the quiver when it's empty.
  • Accidental object quivering when firing with an empty quiver is unset when cancelling the subsequent firing prompt (useful for vi-keys players who typo an object into the quiver when they expected a firing direction).
  • Object filter menus show object class characters.
    • Choosing e.g. 'cursed' and 'armor' at multi-drop/loot menus matches 'cursed armor' instead of 'all cursed objects' and 'all armor', can be controlled with the new menumatch option (default 'tight', old behavior with 'loose').
    • Choosing "A - Auto-select every item" now respects other match criteria.
  • Corpses in object listings (e.g. inventory) are colored like they are on the map.
  • Show number of available skill slots in the #enhance menu.
    • Show "s - Skills" from Ctrl-X character attributes menu.
  • Rogues begin with their stack of daggers quivered rather than wielded as an alternate weapon.
  • Suggest #wipe when blinded by venom or cream pies.
  • Elemental Planes are properly named in the dungeon overview.
  • Portals and stairs seen, but not yet visited, are noted in the dungeon overview.
  • Note seen but unvisited magic portals and branch stairs in dungeon overview.
  • Wizard mode characters can force a teleport to succeed.
  • Far-look notes multiple stacks of objects on a space (only relevant with UnNetHack changes).
  • Tutorial Mode improvements
    • Tutorial messages rewritten to be more concise, and now list relevant commands at the bottom.
    • Messages for number pad movement are shown by default, but matching vi-keys messages can be selected in the tutorial review menu.
    • Using an item in your inventory shows the tutorial message for the item class if it hasn't been shown already.
    • Tutorial review menu split up with headers and marks latest message.
  • Boulders display as 0 (zero) by default in ASCII graphics mode.
  • Water and branch stairs use better Unicode characters.
  • Faster sparkle animation.
  • "More info" text blocks show the query as the title.
  • Improved quick command reference, accessed via ??.
  • Previous message log scrolled to the bottom by default.
  • Mention bag of holding explosions in character history.
  • More alternate spellings for object names when wishing:
    • lembas
    • wand of invisibility/speed/teleport
    • ring of strength/constitution/intelligence/wisdom/dexterity
    • ring of accuracy/damage
  • Pressing @ while choosing map position moves cursor back to the player.
    • Pressing ? while choosing map position brings up a help box.
  • Heavyshot: random skill-based damage multiplier instead of multishot for crossbows, shuriken, spears, javelins and boomerangs.
    • Spears get a racial +1 to their heavyshot multiplier.
    • Javelins get a +1 heavyshot multiplier at basic skill and higher.
  • Spell menus show remaining memory as an ASCII bar, e.g. [||||....].
  • Items stack regardless of knowledge of enchantment and rustproofing, so e.g. random daggers can stack with a rogue's starting +0 daggers.
  • Allow hitting with polearms and lances in melee.
  • Allow spellcasting with stuck hands if they're stuck to a quarterstaff.

NitroHack bug fixes

  • Fix crash when throwing or dropping an item while engulfed.
  • Fix spurious dmonsfree error messages when saving or quitting.
  • Splittable adjust no longer splits cursed wielded weapons.
  • Fix "ab-f" instead of "a-f" in item prompts.
  • Listings of inventory items now match the order in the inventory command and sidebar.
  • Say 'blocked' and not 'silly' when trying to take off body armor blocked by other armor via the inventory object action menu.
  • Show drop action in inventory object action menu for objects in the alternate weapon slot.
  • Dungeon overview now records tool shops, bookstores and lighting shops correctly.
  • Dungeon overview now records and reports temples, altars and their alignments correctly.
  • Viewing levels in dungeon overviews now uses the correct tile set, e.g. for the Rogue level.
  • Use the correct tile set when loading a game, e.g. saved on the Rogue level.
  • Fix missing mention of strange objects with the far-look command.
  • Fix visible monsters not clearing remembered invisible symbols.
  • Fix layered memory bugs with ball and chain when punished and blind
  • Fix off-by-one when using far-look on a monster in a (spiked) pit, bear trap or web.
    • Describe trap once, not twice, when using far-look on a monster in a (spiked) pit, bear trap or web.
  • Fix dump logs having messages from previous games played in the same process.
  • Fix double-mention of empty carried containers at the end of games.
  • Fix travelling using an extra turn when leading the player into a wall or other obstacle.
  • Cancelling direction prompts with escape no longer displays "What a strange direction!"
  • Space and enter no longer quit the game at the main menu.
  • Allow pits (and other traps) to be escaped with < (goes with fix for C343-12).
  • Use printf instead of echo -e to create game launch script.
  • Fix crash when an engraving is replaced.
  • Fix add_region() to use its level argument instead of the level global pointer.
  • Fix search_door() to use a level argument instead of the level global pointer.
  • Fix crash when msummon() is called with a NULL monster.
  • Show printdungeon extended command in wizard mode.
  • Fix erroneous messages when encumbrance state bleeds across games played in the same process.
  • Fix reapplication of real-time game state changes when restoring a game on turns divisible by 100 (could cause log replay deviation).
  • Update map immediately when changing the hilite_pet interface option.
  • Replace nonsensical "direction" in "Unknown direction" message when picking a map position to target.
  • Fix crash in pline() with overly long messages.
  • Record the real wish input in #history command.
  • Fix cornuthaum charisma change (or lack thereof) in calc_attr_bonus().
  • Show the correct monster appearance when the monster is ridden, fixing e.g. (war)horses appearing as ponies when ridden.
  • Don't allow running or travel when stunned or confused.
  • Wrap long messages in the previous message history (Ctrl-P listing).
  • Prevent monsters getting multishot when stunned, like for the player.
Clone this wiki locally