NethackMode

Emacs Major Mode for Playing Nethack

Nethack-el is a major mode for playing nethack. it communicates with a nethack sub-process.

Features include customizable keys, hooks on game events, customizable colors, run-time switching between text and glyphs, and all the beauty that comes with emacs.

Nethack-el also requires a patched version of nethack. The patch comes with the nethack-el package and adds an additional window port to nethack. This ‘lisp’ port is a serialization of the nethack window port interface and can be used for more than just a lisp port. In the CVS version you can also play over the internet.


I love playing nethack in emacs, but was annoyed that simple cp437(IBMgraphics) to UTF8 was not handled. The following patch should fix this problem. Since it only effects the map display, the following could be easily modified to allow map character to be translated to anything without effecting the rest of the display. Undoubtedly a more elegant solution exists.

(defun nh-ibm-trans (ch)
         (nth ch '( #x2007 #x263A #x263B #x2665 #x2666 #x2663
         #x2660 #x2022 #x25D8 #x25CB #x25D9 #x2642 #x2640 #x266A
         #x266B #x263C #x25BA #x25C4 #x2195 #x203C #x00B6 #x00A7
         #x25AC #x21A8 #x2191 #x2193 #x2192 #x2190 #x221F #x2194
         #x25B2 #x25BC #x0020 #x0021 #x0022 #x0023 #x0024 #x0025
         #x0026 #x0027 #x0028 #x0029 #x002A #x002B #x002C #x002D
         #x002E #x002F #x0030 #x0031 #x0032 #x0033 #x0034 #x0035
         #x0036 #x0037 #x0038 #x0039 #x003A #x003B #x003C #x003D
         #x003E #x003F #x0040 #x0041 #x0042 #x0043 #x0044 #x0045
         #x0046 #x0047 #x0048 #x0049 #x004A #x004B #x004C #x004D
         #x004E #x004F #x0050 #x0051 #x0052 #x0053 #x0054 #x0055
         #x0056 #x0057 #x0058 #x0059 #x005A #x005B #x005C #x005D
         #x005E #x005F #x0060 #x0061 #x0062 #x0063 #x0064 #x0065
         #x0066 #x0067 #x0068 #x0069 #x006A #x006B #x006C #x006D
         #x006E #x006F #x0070 #x0071 #x0072 #x0073 #x0074 #x0075
         #x0076 #x0077 #x0078 #x0079 #x007A #x007B #x007C #x007D
         #x007E #x2302 #x00C7 #x00FC #x00E9 #x00E2 #x00E4 #x00E0
         #x00E5 #x00E7 #x00EA #x00EB #x00E8 #x00EF #x00EE #x00EC
         #x00C4 #x00C5 #x00C9 #x00E6 #x00C6 #x00F4 #x00F6 #x00F2
         #x00FB #x00F9 #x00FF #x00D6 #x00DC #x00A2 #x00A3 #x00A5
         #x20A7 #x0192 #x00E1 #x00ED #x00F3 #x00FA #x00F1 #x00D1
         #x00AA #x00BA #x00BF #x2310 #x00AC #x00BD #x00BC #x00A1
         #x00AB #x00BB #x2591 #x2592 #x2593 #x2502 #x2524 #x2561
         #x2562 #x2556 #x2555 #x2563 #x2551 #x2557 #x255D #x255C
         #x255B #x2510 #x2514 #x2534 #x252C #x251C #x2500 #x253C
         #x255E #x255F #x255A #x2554 #x2569 #x2566 #x2560 #x2550
         #x256C #x2567 #x2568 #x2564 #x2565 #x2559 #x2558 #x2552
         #x2553 #x256B #x256A #x2518 #x250C #x2588 #x2584 #x258C
         #x2590 #x2580 #x03B1 #x00DF #x0393 #x03C0 #x03A3 #x03C3
         #x00B5 #x03C4 #x03A6 #x0398 #x03A9 #x03B4 #x221E #x03C6
         #x03B5 #x2229 #x2261 #x00B1 #x2265 #x2264 #x2320 #x2321
         #x00F7 #x2248 #x00B0 #x2219 #x00B7 #x221A #x207F #x00B2
         #x25A0 #x00A0)))

   (defun nh-gamegrid-set-cell (x y c)
     (save-excursion
       (let ((buffer-read-only nil))
         (goto-char (gamegrid-cell-offset x y))
         (delete-char 1)
         (insert-char c 1))))

   (defun nhapi-print-glyph (x y color glyph tile ch &optional special)
     "Insert glyph into `nh-map-buffer'."
     (set-buffer nh-map-buffer)
     (setq x (- x 1))			; FIXME: put this hack in C
     (let ((inhibit-read-only t))
       (if nethack-use-tiles
           (save-excursion 
             (let ((buffer-read-only nil))
               (goto-char (gamegrid-cell-offset x y))
               (delete-char 1)
               (insert-image (elt nh-tile-vector tile))))
         (nh-gamegrid-set-cell x y (nh-ibm-trans ch))
         ;; If the glyph is a pet then color it with the
         ;; nethack-pet-face.
         (let ((color (if (eq special 'pet)
                          'nethack-pet-face
                        (aref nh-colors color))))
           (put-text-property (gamegrid-cell-offset x y)
                              (1+ (gamegrid-cell-offset x y))
                              'face
                              color)))))

CategoryGames