NetHack 3.6.0 - Pandora Specific Controls [Hacky Build]


Still Fresh
Jan 3, 2013

I don't tend to post here much, but I have been lurking for awhile. By the way, I'm not overly experienced in programming in C, or porting titles. I apologise if this forum is the wrong place to ask about this, as it is mostly about NetHack source code, but partly about Pandora controls and PND packaging. Is this even the right board?

Firstly: I've compiled and run NetHack 3.6.0 on my Pandora - this was quite simple. If anyone is terribly interested, I can post the steps needed to compile it, although it is quite straightforward. I've spent the last weekend delving into the source code, the (seemingly outdated) Pandora wiki (see here - it links to the gp32x forums*) and the forums here. It all works fine, but I'm really not a fan of using the yughjkbn (or vi) keys for movement - typing #kick 3 or 4 times in a row isn't much fun compared to the 'k' key - and we have these nice gaming controls; why not use them?

Second: I'm aware of the port of NetHack available on the repo by lunixbochs (who has done a much better job than I can imho - I don't mean to devalue his work with this thread). This almost overcomes the issue - the D Pad works for making axis-aligned movements, and the diagonals can be done with the vi keys... Ideally I'd like to have at least two solutions for this - some suggestions: Use a shoulder button (e.g. right - ctrl isn't often used, so the 'Select' button should do) to 'rotate' the D Pad by 45 degrees clockwise - so Right Shoulder + Up = diagonal right + up. Or use the ABXY gaming buttons for diagonals, or maybe the nubs for all directions? ** The nubs will likely be the hardest to implement, but I'm willing to try! I personally have some gripes with this port too - the only clear ways to exit the game are through ctrl + c, or the extended command, #quit - both of which kill your character. You can press F11, then right-click the tray icon to close it, or even go through the trial of alt + F4... Typically, you just close the console window and your progress is saved. To me this seems essential, as an entire run can easily last 24 hours, and to new users of the ported version, this may pose a problem (see the repo comments as an example).

I've decided to post here in the hopes that someone might be able to give me some pointers (there is a distinct lack of decent documentation for the huge NetHack source code):

1. Where is the code that sets the direction buttons?
I managed to find an array that appeared to store all of the keyboard commands (not sure where though), including the vi keys, but only as letters (no key codes) - so I'm unsure how to set these as the gaming controls - what are the characters/strings associated with them (e.g. page up)? (I assume NetHack makes this difficult in particular, as it uses essentially every key, so there can't be cheating like swapping the vi keys for WASD) And where do the numpad keys come into play anyway? The functions "do_move()" and "getdir()" turn up a lot, and I can find where they are defined, but can't seem to find where the keys are bound. lunixbochs managed to solve the movement problem somehow though. I may be being totally dumb and missing something obvious - I'm here to learn!

2. What are the keycodes for all of the gaming buttons (the wiki mentions conflicting codes)? And how can I make them play nice with the NetHack code?

3. Are there any better suggestions for controls, including diagonals?

4. Are there any other QoL improvements that can be thought of?

5. Would anyone be interested in this going onto the repo? And would leaving it as a standard console application (no fancy fullscreen mode) be acceptable? This at least allows you to close the window, and you can still use F11 to toggle it.

I am happy to code the movement controls in, provided these questions are answered, but I can't make any promises on quality or time scales. I don't want to be a nuisance and ask someone else to do this for me (I think this is achievable and will be a good learning experience), but all of this is moot if someone here/lunixbochs is working on it already.

Thank you for taking the time to read this, and I appreciate any help I can get!

Edit: Compiled (hacky) build here

* Note: most of the threads I've since found on here, and didn't find anything really helpful for this problem in particular...
** Some input here would be nice... Some of you must play NetHack, right? I can (probably) include all of the options, and allow the user to change them through the in-game options - so not worth a poll imo.
Last edited:


Rare Species
Jun 17, 2015
You can use Ctrl+D to kick. Also theres a port of "Vultures Eye"(an isometric graphical interface for Nethack) which can be completely Controled by Mouse/Touchscreen AFAIK.


Still Fresh
Jan 3, 2013
I didn't know about Ctrl+D (v. rusty on NetHack controls), but I have played around with the graphical interface conversions in the past... I'm a stickler for the old ASCII graphics though, and I enjoy the challenge of the complex keyboard commands. It may be that no one else is interested in a port of the latest version - think of my post as me testing the water.
I just thought this was a neat way to give something back to this community, and learn new skills in the process!
Thanks for your suggestions though; as I said, any advice is welcome!


Still fresh, damnit!
Oct 6, 2008
Somewhere off the coast of the EU
FWIW, I fixed the gp32x links on that page. At least one broken link remains (to an ex-mediafire hosted file), but I'm leaving that there in case somebody has a copy they can reupload.

There are a number of *hack-like games on the repo but a more up-to-date version of the daddy of them would be welcome, IMO, and I'll certainly test it out. I'd prefer the controls to be mapped to the Pandora buttons if possible, and your suggestion of a modifier to rotate the d-pad sounds good to me.

I've pulled down the nethack repo, but my C skills are rusty at best, and I haven't found much that's likely to be of use yet. I was unable to find the array you refer to with all the keys in, and the only reference I found to 'hjkl' is in an amiga configuration. That does seem to relate to modifying the controls though, but I was unable to figure out how it interfaces with the main system.

The file Porting has some hopefully useful words about porting which may help to frame things slightly, but it didn't say anything about configuring the controls specifically, unfortunately.


Still Fresh
Jan 3, 2013
Thank you,

I was thinking the same! Well if it's any help, I have the copy of the array, from cmd.c: (warning - huge)
static const struct func_tab cmdlist[] = {
{ C('d'), FALSE, dokick }, /* "D" is for door!...? Msg is in dokick.c */
{ C('e'), TRUE, wiz_detect },
{ C('f'), TRUE, wiz_map },
{ C('g'), TRUE, wiz_genesis },
{ C('i'), TRUE, wiz_identify },
{ C('l'), TRUE, doredraw }, /* if number_pad is set */
{ C('n'), TRUE, donamelevel }, /* if number_pad is set */
{ C('o'), TRUE, dooverview_or_wiz_where }, /* depends on wizard status */
{ C('p'), TRUE, doprev_message },
{ C('r'), TRUE, doredraw },
{ C('t'), TRUE, dotele },
{ C('v'), TRUE, wiz_level_tele },
{ C('w'), TRUE, wiz_wish },
{ C('x'), TRUE, doattributes },
{ C('z'), TRUE, dosuspend_core },
{ 'a', FALSE, doapply },
{ 'A', FALSE, doddoremarm },
{ M('a'), TRUE, doorganize },
{ M('A'), TRUE, donamelevel }, /* #annotate */
/* 'b', 'B' : go sw */
{ 'c', FALSE, doclose },
{ 'C', TRUE, docallcmd },
{ M('c'), TRUE, dotalk },
{ M('C'), TRUE, doconduct }, /* #conduct */
{ 'd', FALSE, dodrop },
{ 'D', FALSE, doddrop },
{ M('d'), FALSE, dodip },
{ 'e', FALSE, doeat },
{ 'E', FALSE, doengrave },
{ M('e'), TRUE, enhance_weapon_skill },
{ 'f', FALSE, dofire },
/* 'F' : fight (one time) */
{ M('f'), FALSE, doforce },
/* 'g', 'G' : multiple go */
/* 'h', 'H' : go west */
{ 'h', TRUE, dohelp }, /* if number_pad is set */
{ 'i', TRUE, ddoinv },
{ 'I', TRUE, dotypeinv }, /* Robert Viduya */
{ M('i'), TRUE, doinvoke },
/* 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N' : move commands */
{ 'j', FALSE, dojump }, /* if number_pad is on */
{ M('j'), FALSE, dojump },
{ 'k', FALSE, dokick }, /* if number_pad is on */
{ 'l', FALSE, doloot }, /* if number_pad is on */
{ M('l'), FALSE, doloot },
/* 'n' prefixes a count if number_pad is on */
{ M('m'), TRUE, domonability },
{ 'N', TRUE, docallcmd }, /* if number_pad is on */
{ M('n'), TRUE, docallcmd },
{ M('N'), TRUE, docallcmd },
{ 'o', FALSE, doopen },
{ 'O', TRUE, doset },
{ M('o'), FALSE, dosacrifice },
{ M('O'), TRUE, dooverview }, /* #overview */
{ 'p', FALSE, dopay },
{ 'P', FALSE, doputon },
{ M('p'), TRUE, dopray },
{ 'q', FALSE, dodrink },
{ 'Q', FALSE, dowieldquiver },
{ M('q'), TRUE, done2 },
{ 'r', FALSE, doread },
{ 'R', FALSE, doremring },
{ M('r'), FALSE, dorub },
{ M('R'), FALSE, doride }, /* #ride */
{ 's', TRUE, dosearch, "searching" },
{ 'S', TRUE, dosave },
{ M('s'), FALSE, dosit },
{ 't', FALSE, dothrow },
{ 'T', FALSE, dotakeoff },
{ M('t'), TRUE, doturn },
{ M('T'), FALSE, dotip }, /* #tip */
/* 'u', 'U' : go ne */
{ 'u', FALSE, dountrap }, /* if number_pad is on */
{ M('u'), FALSE, dountrap },
{ 'v', TRUE, doversion },
{ 'V', TRUE, dohistory },
{ M('v'), TRUE, doextversion },
{ 'w', FALSE, dowield },
{ 'W', FALSE, dowear },
{ M('w'), FALSE, dowipe },
{ 'x', FALSE, doswapweapon },
{ 'X', FALSE, dotwoweapon },
/* 'y', 'Y' : go nw */
{ 'z', FALSE, dozap },
{ 'Z', TRUE, docast },
{ '<', FALSE, doup },
{ '>', FALSE, dodown },
{ '/', TRUE, dowhatis },
{ '&', TRUE, dowhatdoes },
{ '?', TRUE, dohelp },
{ M('?'), TRUE, doextlist },
#ifdef SHELL
{ '!', TRUE, dosh },
{ '.', TRUE, donull, "waiting" },
{ ' ', TRUE, donull, "waiting" },
{ ',', FALSE, dopickup },
{ ':', TRUE, dolook },
{ ';', TRUE, doquickwhatis },
{ '^', TRUE, doidtrap },
{ '\\', TRUE, dodiscovered }, /* Robert Viduya */
{ '`', TRUE, doclassdisco },
{ '@', TRUE, dotogglepickup },
{ M('2'), FALSE, dotwoweapon },
{ WEAPON_SYM, TRUE, doprwep },
{ ARMOR_SYM, TRUE, doprarm },
{ RING_SYM, TRUE, doprring },
{ AMULET_SYM, TRUE, dopramulet },
{ TOOL_SYM, TRUE, doprtool },
{ '*', TRUE, doprinuse }, /* inventory of all equipment in use */
{ GOLD_SYM, TRUE, doprgold },
{ SPBOOK_SYM, TRUE, dovspell }, /* Mike Stephenson */
{ '#', TRUE, doextcmd },
{ '_', TRUE, dotravel },
{ 0, 0, 0, 0 }
If you just ctrl + F "movement commands" you'll find the relevant comment, but it seems I was mistaken in my first post - the movement commands aren't here, so they must be defined elsewhere... This array could still be useful if we want to map the ABXY buttons to things though I guess? Sorry to make you bark up the wrong tree! I'll keep looking, and try some stuff out to see if I get anywhere. I'm sure one of us will get it sorted - if there's one thing I've learned it's that everyone here is pretty resourceful and willing to help.

Glad to see the wiki getting some love too! Thanks again!

2nd EDIT (was looking in wrong source):
I think I've found what I was after - the file cmd.c on line 3119:

/* called at startup and after number_pad is twiddled */
boolean initial;
static const char sdir[] = "hykulnjb><",
sdir_swap_yz[] = "hzkulnjb><",
ndir[] = "47896321><",
ndir_phone_layout[] = "41236987><";
static const int ylist[] = {
'y', 'Y', C('y'), M('y'), M('Y'), M(C('y'))
const struct func_tab *cmdtmp;
boolean flagtemp;
int c, i, updated = 0;

if (initial) {
updated = 1;
for (i = 0; i < SIZE(cmdlist); i++) {
c = cmdlist.f_char & 0xff;
Cmd.commands[c] = &cmdlist;
Cmd.num_pad = FALSE;
Cmd.pcHack_compat = Cmd.phone_layout = Cmd.swap_yz = FALSE;
} else {
/* basic num_pad */
flagtemp = iflags.num_pad;
if (flagtemp != Cmd.num_pad) {
Cmd.num_pad = flagtemp;
/* swap_yz mode (only applicable for !num_pad) */
flagtemp = (iflags.num_pad_mode & 1) ? !Cmd.num_pad : FALSE;
if (flagtemp != Cmd.swap_yz) {
Cmd.swap_yz = flagtemp;
/* Cmd.swap_yz has been toggled;
perform the swap (or reverse previous one) */
for (i = 0; i < SIZE(ylist); i++) {
c = ylist & 0xff;
cmdtmp = Cmd.commands[c]; /* tmp = [y] */
Cmd.commands[c] = Cmd.commands[c + 1]; /* [y] = [z] */
Cmd.commands[c + 1] = cmdtmp; /* [z] = tmp */
/* MSDOS compatibility mode (only applicable for num_pad) */
flagtemp = (iflags.num_pad_mode & 1) ? Cmd.num_pad : FALSE;
if (flagtemp != Cmd.pcHack_compat) {
Cmd.pcHack_compat = flagtemp;
/* pcHack_compat has been toggled */
c = M('5') & 0xff;
cmdtmp = Cmd.commands['5'];
Cmd.commands['5'] = Cmd.commands[c];
Cmd.commands[c] = cmdtmp;
c = M('0') & 0xff;
Cmd.commands[c] = Cmd.pcHack_compat ? Cmd.commands['I'] : 0;
/* phone keypad layout (only applicable for num_pad) */
flagtemp = (iflags.num_pad_mode & 2) ? Cmd.num_pad : FALSE;
if (flagtemp != Cmd.phone_layout) {
Cmd.phone_layout = flagtemp;
/* phone_layout has been toggled */
for (i = 0; i < 3; i++) {
c = '1' + i; /* 1,2,3 <-> 7,8,9 */
cmdtmp = Cmd.commands[c]; /* tmp = [1] */
Cmd.commands[c] = Cmd.commands[c + 6]; /* [1] = [7] */
Cmd.commands[c + 6] = cmdtmp; /* [7] = tmp */
c = (M('1') & 0xff) + i; /* M-1,M-2,M-3 <-> M-7,M-8,M-9 */
cmdtmp = Cmd.commands[c]; /* tmp = [M-1] */
Cmd.commands[c] = Cmd.commands[c + 6]; /* [M-1] = [M-7] */
Cmd.commands[c + 6] = cmdtmp; /* [M-7] = tmp */
} /*?initial*/

if (updated)
Cmd.dirchars = !Cmd.num_pad
? (!Cmd.swap_yz ? sdir : sdir_swap_yz)
: (!Cmd.phone_layout ? ndir : ndir_phone_layout);
Cmd.alphadirchars = !Cmd.num_pad ? Cmd.dirchars : sdir;

Cmd.move_W = Cmd.dirchars[0];
Cmd.move_NW = Cmd.dirchars[1];
Cmd.move_N = Cmd.dirchars[2];
Cmd.move_NE = Cmd.dirchars[3];
Cmd.move_E = Cmd.dirchars[4];
Cmd.move_SE = Cmd.dirchars[5];
Cmd.move_S = Cmd.dirchars[6];
Cmd.move_SW = Cmd.dirchars[7];

This appears to be all of the movement controls, with different layouts for different devices; also looks like this supports modifiers, e.g. control. I can fiddle around with this and hopefully get something working...

The issue I have though, is how can I specify a 'w' (or similar) from the D Pad, and not the keyboard, and/or how could I use a modifier for the diagonals? I can't think of a way to do it with just characters, but again, that may be my inexperience.

Maybe the development section is a more fitting place for this thread?
Last edited:


Apr 1, 2014
NetHack 3.x's input handling doesn't support handling codes with Escape in it. All relevant controls (ABXY, directionals, etc) has it included.
Back when 3.4.3 was the latest version, I used to use the "curses" interface (the vanilla interface is also done in curses, the name is a misnormer) which has proper arrow key support. That way I ended up moving with the D-pad and using diagonals with yubn.

3.6.x however, lacks this interface patch. There are various GUI ports (including a X11 one), but I always preferred ASCII myself.
So you can't really use an existing solution, unless you're willing to patch the curses interface to 3.6.0 (and there's quite a lot of code changes...).

Nethack4 (a community variant) solves all those problems, but, well, it's NetHack4 (so non-vanilla and based on 3.4.3...)

Nowdays, I just use vikeys -- more portable and allows me to play without issues on online servers.

Now I'm going to reply to the questions you had that I can answer properly.

3: If you're going to make an input handler from scratch, I suggest introducing Mystery Dungeon-style controls, I was always a fan of how it did input handling (directional keys to move in +, hold R to lock the + directions so you can use the d-pad to move diagonally). If you have the game(s), any Pokémon Mystery Dungeon showcases this.
4: There is a lot of QoL changes and bug fixes (There are also a lot of gameplay changes, some which I disagree with...). 3.6.0 introduced a lot of community patches that has been made over the years to improve the hostile user interface. Basically every single one of them (and more) can also be seen in the "NAO" patch for 3.4.3 (which also has a few other interface improvements).
5: Yes to both questions.
Last edited:


May 23, 2011
lunixbochs managed to solve the movement problem somehow though.
The previous NetHack PND uses xmodmap to change the D-pad to hjkl keys before the game is started.

In my opinion D-pad + yubn work great for movement once you get used to it.


Forum Addict!
Oct 3, 2008
If you look, there is a Vulture's Eye for Pandora - which is vanilla Nethack with an isometric 3d interface laid on it. The nsew directionals work on the game pad, but the diagonals (and up/down) still have to be hit on the keyboard. Still, it's pretty darn good.

I would like to see Vulture's Eye or Vulture or other similar for Pandora/Pyra with other variants too.

I'm looking forward to what can be done for this game on the Pyra's extended controls. In theory with the game pad's directional and 6 buttons, all directional including up/down could ride on the game pad.

Anyway - somehow the person that set up Vulture's Eye for the Pandora figured out how to use the game pad for part of the directionals - it might help to look there to see how they did it?


Still fresh, damnit!
Oct 6, 2008
Somewhere off the coast of the EU
Which version of Nethack is Vulture's Eye though? I note there's a slightly newer source release available than we have on the repo, but that's still a 2.x version. I'm not sure if that means it's based on 2.x Nethack, but to me the point of this thread was getting the latest Nethack running on Pandora - if that means I have to live with ascii graphics, that's fine by me.


Still Fresh
Jan 3, 2013
Yeah, I do have Vulture's Eye on my Pandora (from the repo) - but as I said, I like the ASCII graphics. Also I believe Levi is correct in that Vulture's Eye is outdated (NetHack Wiki claims latest version - 2.3.67 - was realeased 5 years ago) - NetHack 3.6.0 was released this year.

As far as how what I've been doing is going: I have some (minor) updates.

I was hanging about in the #nethack IRC channel and they gave me some very complex pointers about the source, and eventually came to the conclusion (at the same time as matti1234's post) that doing it externally would likely be easiest.

I fiddled around with xmodmap and have bound all of the gaming controls to useful nethack commands - I'll probably get a more concrete keybind layout tomorrow and upload everything here. The solution I have is not the nicest, and I wouldn't be comfortable publishing it on the repo in its current state. The game plays nicely though, with all of the configurable options, and the Pandora controls make everything a breeze. Instead of the right trigger as the diagonal modifier (as planned) I use the left trigger (shift) as this plays nicely with xmodmap.

My gripe with the whole thing is if you Ctrl+c / use another program whilst NetHack is running, none of the gaming controls work. Maybe there's a smart way I can handle this, with redoing my xmodmap commands when the app is in/out of focus (I have no clue on how to properly implement this), but provided you keep that in mind, the whole thing works nicely, and gives me my NetHack fix.

I'll stick an archived version of the compiled game here tomorrow (well this evening in the UK - the 6th) with the little startup script I made, that does all of the fancy xmodmap stuff, and my nethackrc config and instructions on where to put the files etc.

This isn't to say I've given up on finding a more perfect solution, I just want to get something out that works so other people might be able to enjoy it!

Thank you for all of the help and suggestions!
Last edited:


Still fresh, damnit!
Oct 6, 2008
Somewhere off the coast of the EU
According to the output of xmodmap, control is defined as a modifier on my Pandora, consisting of Control_L and Control_R. Whether they're configured to be the correct keys, I've not checked with xev, but I know that at least ctrl+A and ctrl+E work in bash, for example. So I'd have thought the third and fourth arguments on an xmodmap keycode line would correspond to ctrl+key and ctrl+shift+key, despite what the Pandora wiki currently says.

I don't know of any solution to the problem of setting custom keyboard settings and people then ctrl+alting their way out of your app, but it's common to much Pandora software that if the program crashes it will leave your nubs misconfigured - thankfully in my experience at least, things are a lot less crashy these days than they used to be. I tend to expect this if the program is running in a framebuffer, so not in a window. I don't know if it's possible to run terminal apps in a framebuffer, and how hard it would be though.
Last edited:


Advanced Member
May 5, 2013
After looking at the source I think it should be pretty easy to hack this key translation into the ALTMETA handling of readchar() in cmd.c. With default settings the DPAD returns key sequences consisting of ESC [ and one of A to D. Just add a new else checking whether the second character is [ and then reading the third and map it to the desired direction should do the trick. it is also extensible to SHIFT and CTRL combinations that produce similar sequences (just do a cat - in a terminal to see the sequences). It is hack, because it should respect termcap settings and probably not block while parsing the special sequences.

Note: the altmeta input flag has to be enabled to enter this block

Note2: only looked at the master branch of the git repository; might not be applicable to the 3.6 branch

edit: the following is working fine for me (the first change is just to disable the Altmeta configuration check, because I am too lazy to figure out the configuration).
diff --git a/src/cmd.c b/src/cmd.c
index cdad092..cb8ca21 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -4086,11 +4086,24 @@ readchar()
         sym = '\033';
 #ifdef ALTMETA
-    } else if (sym == '\033' && alt_esc) {
+    } else if (sym == '\033' /*&& alt_esc*/) {
         /* iflags.altmeta: treat two character ``ESC c'' as single `M-c' */
         sym = *readchar_queue ? *readchar_queue++ : pgetchar();
         if (sym == EOF || sym == 0)
             sym = '\033';
+        else if (sym == '[')
+        {
+            sym = *readchar_queue ? *readchar_queue++ : pgetchar();
+            if (sym == 'A') sym = 'k';
+            else if (sym == 'a') sym = 'K';
+            else if (sym == 'B') sym = 'j';
+            else if (sym == 'b') sym = 'J';
+            else if (sym == 'C') sym = 'l';
+            else if (sym == 'c') sym = 'L';
+            else if (sym == 'D') sym = 'h';
+            else if (sym == 'd') sym = 'H';
+        }
         else if (sym != '\033')
             sym |= 0200; /* force 8th bit on */
 #endif                   /*ALTMETA*/
Last edited:


Still Fresh
Jan 3, 2013
@levi - I have tested the use of ctrl with xmodmap - it isn't (as far as I can tell) the 2nd modifier, although it would be nice if it were! I'm not sure what the actual modifier xmodmap uses - some form of Alt/AltGr that we don't have on the Pandora? If you run xmodmap -pke you will find both Control_L and Control_R listed, but that is just binding them to the right trigger and the select button.

@_jr_ Ah! This is more what I was after - thank you! I'll fiddle about with this a bit more, as I have also bound some other keys in my version (see below), and maybe think about sticking it in a PND. I'm not sure how much more time I can spend on it this week though, so if anyone thinks they can do it quicker (hint: most people probably could) feel free to! It would be my first PND, so I'm sure I'd bugger it up one way or another! Thank you for taking the time to look, I really do appreciate it!

I'll upload my even hackier solution here still, as I made a nice (to the end user - the setup script is messy) setup script for it. For the best experience, I'd recommend disabling the scrollbar in the xfce-4 terminal prior to playing this (I wanted to do this in my startup script, but couldn't find any way to do it). It can go nicely full screen, no borders/menus/bars (provided you disable the scrollbar) and this is the control scheme I went for:

D Pad: Horizontal and vertical movement
L Trigger (shift) + D Pad: Diagonals - D Pad is rotated 45 degrees clockwise
A: Escape - for cancelling/going back in NetHack menus etc
L Trigger + A: S - for saving progress and quiting
X: , - for picking up/select/select all
L Trigger + X: > - for descending
B: Space - used to continue/see more of NetHack messages, and answer the default to any queries, shown in brackets
L Trigger + B: d - for dropping stuff (I couldn't think of anything else to put here, as most players are v. particular in which movement command is their favourite)
Y: s - for searching
L Trigger + Y: < - for ascending (well, going up ;) )
Start: Default "Alt_L" key
L Trigger + Start: S - alternative to Shift + A (I prefer this keybind)
Select: # - for those extended commands

Feel free to make suggestions or anything!

Tips for using/extracting it:

You can extract this anywhere, and it (should) all work fine!

After extraction, make sure your terminal is running from the destination directory, then just ./ - this script first tests you are running it from the extracted directory, then asks if you want to use a NAO-based nethackrc config file, then asks if you want to make a desktop shortcut (I'd recommend this - it handles all of the fullscreen stuff, and gives it a cute icon, which I stole from lunixboch's NetHack in the repo).

Note: The config file is stored at ~/.nethackrc - not the best place for it, but it was easy to put there!

If you go without the desktop shortcut, you'll want to run the script "" in the nethack subdirectory of the extracted archive.

Hope someone enjoys this, and I'll keep this thread up to date on my progress RE the ALTMETA hack!

Edit: Oh also, if you find the gaming controls are messed up (e.g. D Pad up types an 8) - there is a script ( that puts them back to their normal state!

Edit again: It seems I broke it... Turns out nethack wants to always chdir into where you compiled it to - I had no idea! Sorry, my bad. Best solution I can think of is: compile nethack 3.6.0 on your pandora, then copy the compiled folder into the extracted archive, and call it "nethack". This really sucks, and I have no idea how to fix it other than that. I'll try and sort something this week


  • pand_nethack360.tar.gz
    2.9 MB · Views: 272
Last edited: