NitroHack 4.0.0 release

Daniel Thaler daniel at invalid.address.com
Sun Jan 15 21:17:07 PST 2012


Hi everyone!

This is the initial public release of NitroHack, a fork of NetHack.

The website for NitroHack is http://nitrohack.org, where you can also 
find screenshots and downloads.

Change log:

Back end features:
     - NitroHack network protocol
       NitroHack supports network play without telnet or ssh over its own
       protocol. The protocol is based on JSON and should make it very
       easy to implement a browser-based NitroHack client (TODO!).

     - New save game format
       The old format was mostly just a dump of the data structures
       from memory onto disk.
       The new format has 2 sections:
       1) A log of the initial random seed and every game action
          performed afterward. This allows a perfect reconstruction of
          the game.
       2) A binary save appended after the log. It uses a fixed-width,
          fixed-endian architecture and compiler independent format, but
          is otherwise a direct descendant of the old save format. This
          format was kept mostly so that bones files could be created in
          it, but it is also used in the savegames for slightly improved
          loading speed.
       The log file is written continuously, so the "INSURANCE" option
       and the recover utility are gone - a crashed game can always be
       restored by replaying the log. After the game ends, the log
       marked as closed and kept.

     - Built in game replay viewing (aka new and improved ttyrec)
       The reason for keeping logs of finished games. Once there was a
       way to reconstruct the state of the game at any point it would
       have been silly not to use it for game viewing.
       Since the replay mode is based on abstract game commands rather
       than directly recorded screen output, it is completely feasible
       to replay a that was played on a unix tty in a windows tile port
       or vice versa.
       A viewer for games is built into the new nethack UI. You can
       perform commands that don't affect the game state (like view
       inventory) while viewing a game replay.

     - New options code
       Options changed ingame are written back to the options file,
       which you are not supposed to edit by hand any more. The options
       have moved to ~/.config/NitroHack/NitroHack.conf (for game
       options) and ~/.config/NitroHack/curses.conf for the options of
       the curses UI.
       Logs of active and completed games are also under
       ~/.config/NitroHack/

     - Birth options
       Want to play without Elbereth? It is now possible to do so without
       recompiling. ELBERETH, REINCARNATION, SEDUCE and bones files have
       become a new kind of option: birth options, which can only be set
       before the character is created.

     - Full separation of user interface code from game code.
       The core game code has moved into a library (libnitrohack.so or
       nitrohack.dll). The game library exposes an API of exactly 23
       functions and is largely OS independent. The display code is part
       of the OS/platform dependent executable and must provide a list
       of callbacks (windowprocs) to the game. There is no shared global
       state between the two.
       This was a prerequisite for the network protocol, which encodes
       the api calls and callbacks almost literally.
       With this change, the days of multiple window port binaries are
       over. It now makes much more sense to have separate programs, for
       example nitrohack-curses and nitrohack-qt.
       The NitroHack network server is technically a UI port and uses
       the same mechanisms.

     - rewritten input system which allows safe key (re)mapping
       The came core never, ever requests a key from the UI. All
       interactions happen on an abstract level: The ui sends commands
       to the core as a string ("wait", "move", etc.), the game may
       request a direction or a position (etc) in return.
       This allows the UI to perform key mapping safely, because it
       is never necessary to guess what context some request for input
       occurs in.

     - All-new curses based text mode UI
       All the old window ports became obsolete due to the extensive API
       changes.
       A new UI based on curses (ncurses on unix, pdcurses on windows)
       has been written. It is a significant upgrade compared to the old
       tty port in terms of usability and features:
        * unicode display, with customizable display chars
        * configurable keymap, with a configuration dialog
        * full arrow key and function key use
        * multiple visible message lines
        * improved status
        * permanent inventory display (if your terminal is wide)
        * Inventory menu with item actions
        * real line editing

     - Layered drawing
       The game core provides a set of display items for each location
       to the UI, rather than a single display char. For example a
       monster on an item on a trap can be represented logically.
       The curses UI displays the alternatives by blinking between them
       (unless you disable blinking in the options).

     - Mersenne twister random number generator
       An OS independent RNG with known state was required in order to
       make game logs replayable. The mersenne twister is the best
       choice.

     - Re-runnable game core.
       Several of the main data structures have been made const, all
       others are carefully re-initialized when a game is started or
       loaded.
       This makes it possible to have a main menu for starting games,
       viewing the top ten or changing options.
       Previously this was not possible, as the altered global state
       from one game would have affected a second, so exiting was the
       only option.

     - No more level files and no more lock files.
       All levels are now kept in memory at all times. This makes a lot
       of locking unnecessary. It also allows viewing of levels you are
       not currently on.
       The only remaining locking is of active game logs via OS
       mechanisms which are not based on files: fcntl on UNIX and
       LockFile on Windows.
       (For a game where all levels have been visited, this change could
       result in up to 5 Mb of extra memory use! The horror!!)

     - No more support for antique systems and compilers
       Support for everything that belongs in a computer history museum
       has been removed: BE, DOS, Classic Mac, Atari, VMS, etc ...
       The list of supported compilers has likewise been reduced to gcc,
       clang and msvc (and probably Intel's compiler, too).
       This allowed the removal of lots and lots of crufty code and
       compat macros.

     - Code cleanups
       The number of "#ifdef FOO" has been cut down from 1938 to just 51
       That makes the code much more readable, because the indentation
       isn't being interrupted every couple of lines. To this end almost
       all compile options that didn't become birth options were enabled
       unconditionally or removed.
       All functions have been converted to use standard prototypes
       rather than K&R declarations. Ugly things like prototype widening
       and the follow-on #defines went away.
       Tools like git diff can now correctly show what function a line
       or change is in.
       All instances of the keyword "register" have been removed -
       optimizing compilers handle this for us. Likewise NEARDATA which
       only made sense on 16-bit computers.

     - New build system: Cmake
       On Linux you get safe parallel builds with pretty colorized
       output, on Windows the generated Visual Studio 2010 project
       builds without problems.


Game features:
     - Autopickup rules
       Real rule sets that control what gets picked up replace the
       pickup list + exceptions system. Rules can match based on the
       name, object type and BUC status.
       The following example rule set picks up all food as well as
       lizard corpses, but no other corpses:
        1. IF name matches "*lizard*" AND type is "food": < GRAB
        2. IF name matches "*corpse*" AND type is "food":   LEAVE >
        3. IF type is "food":                             < GRAB
       Rules are evaluated in order until a matching rule is found. If
       no rule matches, the item is left behind by default.

     - Character history tracking
       NitroHack will automatically track the following items
       (with a turn timestamp) for use in your ascension posts:
        * new depth reached
        * new experience level reached
        * wishes with the exact wish text
        * killed a unique monster
        * lifesaved
        * crowning
        * artifact gifts
        * basic quest status
        * major oracle consultations
        * performed the invocation
        * gained/lost the amulet of yendor (only shown if the amulet is
          identified)
       You can view your heroic deeds with #history

     - Dungeon overview + dungeon annotations
       This change was inspired by the "Dungeon Map Overview 3" patch
       (by Hojita Discordia) as found in UnNetHack.
       You can now #annotate a level to name/describe it.
       #overview / Ctrl+O will show a menu of all the levels you remember
       including your annotations and significant features (shops,
       altars, ...)
       You can select a level from the overview menu to view your memory
       of it.

     - Dump log
       Inspired by Jukka Lahtinen's dumplog patch.
       When you die, a dump log containing the following information
       will be created:
        * Final (ascii) screenshot
        * Player stats
        * Full inventory, including listings of the contents of
          containers
        * Player attributes
        * Known spells
        * Skills
        * Conducts
        * Vanquished opponents
        * Final messages
        * dungeon overview
        * heroic deeds

     - sorted loot
       based on code by Jukka Lahtinen and Patric Müller in UnNetHack.
       Item types are sorted based on:
        1) item name
        2) enchantment
        3) BUC
        4) erodeproofing
        5) erosion
        6) greasedness

     - Miscellaneous changes, in no particular order
        * You can use adjust to split stacks (Sam Dennis)
        * Top ten saves 10000 entries by default
        * Unexplored locations, stone and dark rooms are all logically
          different in the drawing code (but only dark rooms are shown
          differently by default)
        * object class symbols are shown in menu headers
        * you may choose to always show uncursed status in the options
          (Pasi Kallinen)
        * you will be prompted to quiver if firing with an empty quiver
          (Jukka Lahtinen)
        * thrown or fired items will always be picked up automatically
          if you set pickup_thrown in the options (Roderick Schertler)
        * reading spellbooks early is allowed (Alex Smith)
        * naming of monsters, items & item types via menu (from NAO)
        * Improved the died while helpless descriptions (Pasi Kallinen)
        * monster targeting with m when a position is requested
          (inspired by Pasi Kallinen's patch)
        * Very long message history (20k messages)
        * Removing armor and accessories will always trigger a prompt,
          even if there is only one possible choice.
        * Open doors when the player walks into them (AceHack)
        * extinct species are shown together with genocided species
          (based on a patch by Jukka Lahtinen)

     - Fix about 10% of all known NetHack bugs
       C343-  2 Wielded silver arrows don't cause silver damage on some
                silver-haters. (Alex Smith)
       C343-  7 When a steed pushes a boulder into a pool, the message
                misuses "you". (Alex Smith)
       C343-  8 Plural of Nazgul is Nazgul - not Nazguls. (Patric Müller)
       C343- 12 You can't use '>' to enter a pit. (Patric Müller)
       C343- 15 You can get a message that an invisible monster looks
                much better. (Alex Smith)
       C343- 18 Scaring a mimicking mimic gives an incorrect "turns to
                flee" message. (Alex Smith)
       C343- 30 Cursed scroll of destroy armor on cursed armor doesn’t
                always interact correctly. (Alex Smith)
       C343- 50 A sleeping steed may answer a #chat. (Alex Smith)
       C343- 54,-55 "Ulch" message fixes. (Alex Smith)
       C343- 74 Entering a long running, un-interruptible command after
                stoning starts will kill you. (Patric Müller)
       C343- 88 Polymorphing a statue into a boulder can leave an
                incorrect display. (Alex Smith)
       C343- 94,SC343-8 Probing a re-anmiated statue may cause a panic.
                (Patric Müller)
       C343-100 Game may crash if thrown potion hits bars before a
                monster. (Patric Müller)
       C343-109 There is a grammar error in the Tourist leader's
                greeting. (Alex Smith)
       C343-111 Grammar of some graveyard sounds messages is wrong in
                some cases. (Alex Smith)
       C343-116 Grammar error in messages related to choking on gold.
                (Patric Müller)
       C343-123 Plural of "mother-in-law" is incorrect. (Alex Smith)
       C343-136 A samurai quest guardian message uses "ninja" where
                "ronin" is intended. (Patric Müller)
       C343-160 The name "leather spellbook" is misleading. (Alex Smith)
       C343-171 Silver weapon damage message is sometimes missing when
                hero is polymorphed. (Patric Müller)
       C343-179 If a potion of acid is destroyed by water, the game may
                crash. (Patric Müller)
       C343-189 Temple donations and protection lost to gremlin attack
                interact incorrectly. (Patric Müller)
       C343-211 Engraving under water gives a poorly worded message.
                (Patric Müller)
       C343-218 Applying a wielded cream pie can crash the game.
                (Patric Müller)
       C343-222 It's possible to end up wielding a cockatrice corpse
                when no longer polymorphed. (Arthur O'Dwyer)
       C343-231 Time is distorted while sinking into lava.
       C343-235 Casting spell of protection gives incorrect message if
                hero is swallowed or in rock. (Patric Müller)
       C343-248 You can’t put candles in a candelabrum while underwater
               (Sgeo)
       C343-252 There is a typo in the quote from "The Count of Monte
                Cristo." (Patric Müller)
       C343-258 Grammar error in samurai quest: "wakarimasu?" instead of
                "wakarimasu ka?" (Patric Müller)
       C343-259 "Dr. Dolittle" is spelled incorrectly. (Patric Müller)
       C343-270 Dying in a shop while wielding two weapons may cause a
                warning message. (Patric Müller)
       C343-275 If a lit, wielded, candle or potion of oil burns out,
                the game may crash. (Patric Müller)
       C343-276 If a figurine auto-transforms while wielded or worn, the
                game may crash. (Patric Müller)
       C343-298 Kicking at "empty space" uses no time.
       C343-318 Opening or closing the castle drawbridge using music
                takes no time. (Alex Smith)
       C343-324 Bisecting a long worm with 1hp crashes the game.
                (Patric Müller)
       C343-356 Wearing an amulet of restful sleep confuses internal
                sleep state bookkeeping. (L's "Gremlin's Curse")
       C343-386 Pearl rings can rust. (Alex Smith)
       C343-398 The game may crash if a wielded potion of polymorph is
                drunk. (Alex Smith)
       C343-399 Messages referring to a named vault guard have
                grammatical errors. (Alex Smith)
       SC343-12 Calling high priests on Astral reveals their identity.
       SC343-20 Hangup save while picking up gold in a shop may
                duplicate the gold. (Patric Müller)
       My sources for these fixes were UnNetHack, AceHack, the Patchdb.

What didn't change:
The game mechanics of NitroHack remain identical to those of NetHack. 
All the behavior of items and monsters, scoring, difficulty etc. is 
unchanged.
I do believe that there are several things that could be done here, but 
I wanted to do all these fundamental things first.


More information about the roguelike-announce mailing list