where you couldn't do macros with the old 3.4 keymap since the 3.4 keys were done via macros and macros can't recursively invoke macros. Has the little snag that it doesn't exactly reproduce the 3.4 "fire ammo" command since 3.4 automatically goes to the inventory list but 4.0 doesn't.
TODO:
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6587 c06c8d41-db1a-0410-9941-cceddc491573
NS3KXJXQSN33UQSOBDK3WXXKA3KY5YOUJL67NBZKGQAJYDYZ2COQC
CO3GKDYMG4P7SH6QLQSBQTAXPWLKSPNMHTUT46USTBL4YBLT4L5QC
JHO4CST2DIWQVFKBZRXV7UQXLKX2JJYDAHZX2ORJ22ELYWUKXD3QC
SEUJUTDRU4GF3RALVPYSMVWXQDUMU2MZGKMM5GVVAQG4ARE5WFKQC
JB7EF6EXUT2YNICKIS3ODQHB44PWR6PI7QEROSJIZRLZ4GGULEVAC
Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
JYCMD6WMNHXA53K4LLKVTNX6PLRLU25F6J2TYMPQXM2ENAE66NIAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
O3QBT2ISABMEWTNSYEJKAJG6LZMON7U6RQZDSLY2KQHSMILUYQFQC
C55G5JGGSVWMU7XVEJL6YZZLDXQZGRN7JQOAALS6WIKFPX3L2U6QC
WCEH6FL4P6NFEU3LVWBLD36QCRNCFSZAV2H73NN54GIPGZS5UR3QC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
AVCMVFA3MKCXHO6H44UK5KJNIHTGQV7UA7GYXM26VI6TXXU5ZN6QC
LW4N5EHKL776DURXZMAM6JEW3JPWWX5BSNP7TCZHTLCDOQTTGFCAC
SKWBAGSAB625IIN4UP3NCPRX2H3KCPC2LULHS2A7JVRLO3EUBJDAC
HSRRNAU5UAYC6B6IQWGJPFROMZBTJICPCH6DJVZDHDTAGOQ6IOYAC
PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC
ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC
47NSOFQMBZCDIBHEAZSENFUGDSQCX3GJHFBUZ65ARDKCYIZ435LAC
Y5RFQ6KNJCBQUSV2T6WDR7TPZLZYLOAWBVMUTHDXGOZQDZ2U423AC
Y4NA3JSN63RLATF4NNBPSR5CWF5Z7UEMWCGVX4B6NOAR47CGM4GQC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
ABLV37FMURRJPEZV2VRKOUYAKEMLI7E6RA4PDAII2EJ5L7WBHKZQC
UPPUAHXHWKGQWDKOCVLR7RG3SHEUVKOUC5GRYCEUDGD6RNCOU5LAC
LWVP2PEWXDDSVOYQDOMHBW267KDDT6FS7ZN7IZUYRENTSSZMVIUQC
UL7XFKMUX3WIU4O2LZANK4ECJ654UZPDBFGNXUEYZYOLKBYBCG6AC
UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC
O6ZMFKDI3XO2SWPNEYHIPYFDWJR4TVDP5BAATK6LVCVETQID6E7AC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
ACDPN464TK2LKLHSDN3YVRHAPF7WLSLLU3UHIYEXKFDEZPEU3XSQC
XX62GOJVDP352L4BH7MELNYXHMZNA6VAGF7B6RWWOSULX7VJR5YAC
3FRPKD2JSN7RA2HKWAO3XV7MMKCIAMWIMU6JNJ452VZEUSXM6PWQC
NDGNTJWFOIU5EYAJU75FRRUICLCVQAJJ65NJ33ZGWDEYZZECPQEAC
NPCS4YLWULGF5Y5PIC2NYMKM3DUPGBLWU3SYVMUIFR25EIZ772BAC
VDWXI5MMXZLJXWWPZPXJZ2YZIR2OMPQO3VIJO2HMTF4TPYJB2MDQC
UTAEFV7G3WPVCBJQABZFOY5USPXSVD6AZ5A6EV7IJFVY76ZOXBQQC
NCHTJYDWTFLBWRQ3NS47O4ZAPT6RN7P2GNUT7G2PPVNURCLCWW6AC
CKY7MRFWMNHXIPJD5ZUAJN5T2YHUIEAYBNYYV5GN74LBZJRDJMEQC
TV3ZC6WOZKSQQJQN26JIVKCHK6UK7WMDBYZDUYRWEAZ4JB4YVNAAC
2GV6OW7P54FXZ5OD2NUMX7MLXH424LYAFMOAUQ2UGSOLKLYDBJGAC
43ZTEB57FU7KE5EVMYWZONNVJBZCGF3JEAJZIY25LC4LGE65PG5QC
FWR2IOUBSV4KSFV6YGTKZBTOD2DIUMFYBWHCIYLQJ5PCNAIETDPAC
P2YNOE2TUTZFAOBTHJOIVD6TCV7J7D2UKUX67LHZUL6QY44ZMENQC
TRZAZJJA5VQBJ65SO5H5DNSILIZEJHIZCBYEBHEATCT6ZSMWIFKQC
UDYVF65OZSNPANLHDI3ODBEGUAKAVZ4KH4OZFAKR2CQJPO4AXU6QC
6TEISZD7HYSSL24EOKIBNURU66KGSQX7B7SNAHBP4DQSAOTGH2MQC
IIN7AVA6JYRBXH6ZYRR7BY7TV6PW7ANAQ2A3PD55FKBKKQFEEF2AC
4MVVT4S3DIGUOAQMHDORGV6JI344UGUZA5ZAIUU6IO6HIWHPWUMAC
72GIZBEMQLEF3TITOHABWHRLL5TE7KOUSVWOUEHFMO2OZQ4EIB7AC
2VDLCWQOJPOXPJQ7XYGOWZG5P2AE44DGFHC76WI4GBOOK4B7FQTQC
EVDZD4MDODICQF3ZEN3EVR3IKQHN7O2GWIHYIZZZXBBXQIY3UPOQC
LOAHVKQFG57THOYHK6ONP5YUUO2WATATFTW3IETBPJZ5NYO3KZ5AC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
EHSY6DVGUMI6C67WKET3GDJVLWJWGYBYQONNDK5JVT7BCTHBEZVAC
SPBZ5D2DYKO75D63YAW6U75DYTV6ZK5W5OBJHJHIDNGNSRGYXEFAC
UFGBNLXSCQWIKCFRAPQNAMQOW3KGAIFXSNQ26PH5CXGF3DXXJ4SQC
#!/usr/bin/perl -w
use strict;
my ($infile, $outfile);
if (-e "enum.h")
{
$infile = "enum.h";
$outfile = "cmd-name.h";
}
elsif (-e "../enum.h")
{
$infile = "../enum.h";
$outfile = "../cmd-name.h";
}
else {
die "Can't find 'enum.h'";
}
unless (open(INFILE, "<$infile")) {
die "Couldn't open '$infile' for reading: $!\n";
}
unless (open(OUTFILE, ">$outfile")) {
die "Couldn't open '$outfile' for writing: $!\n";
}
# All set, now get to first command
while (<INFILE>) {
last if (/^ *CMD_NO_CMD/);
}
unless (/^ *CMD_NO_CMD/) {
die "Couldn't find CMD_NO_CMD in enum.h\n";
}
print OUTFILE "// Generated by util/cmd-name.pl\n\n";
while (<INFILE>) {
# Pass through pre-processor directives
if (/^#/) {
print OUTFILE $_;
next;
}
s|//.*||; # Strip comments
s/=.*//; # Strip enum asignments
s/\s//g; # Strip whitespace
s/,$//; # Strip comma
next if (/^$/); # Skip blank lines
my $cmd = $_;
unless ($cmd =~ /^CMD_/) {
die "'$cmd' doesn't start with CMD_\n";
}
# Don't include synthetic keys
last if ($cmd eq "CMD_DISABLE_MORE");
# Skip MIN or MAX enums, since they aren't commands
next if ($cmd =~ /^CMD_(MIN|MAX)_/);
print OUTFILE "{$cmd, \"$cmd\"},\n";
}
# End of array sentinel
print OUTFILE "\n";
print OUTFILE "{CMD_NO_CMD, NULL}\n";
close (INFILE);
close (OUTFILE);
exit (0);
///////////////////////////////////////////////////////////////
// Keybinding stuff
void init_keybindings();
command_type name_to_command(std::string name);
std::string command_to_name(command_type cmd);
command_type key_to_command(int key, KeymapContext context);
int command_to_key(command_type cmd);
KeymapContext context_for_command(command_type cmd);
void bind_command_to_key(command_type cmd, int key);
typedef std::map<std::string, int> name_to_cmd_map;
typedef std::map<int, std::string> cmd_to_name_map;
struct command_name
{
command_type cmd;
const char* name;
};
static command_name _command_name_list[] = {
#include "cmd-name.h"
};
static name_to_cmd_map _names_to_cmds;
static cmd_to_name_map _cmds_to_names;
struct default_binding
{
int key;
command_type cmd;
};
static default_binding _default_binding_list[] = {
#include "cmd-keys.h"
};
typedef std::map<int, int> key_to_cmd_map;
typedef std::map<int, int> cmd_to_key_map;
static key_to_cmd_map _keys_to_cmds[KC_CONTEXT_COUNT];
static cmd_to_key_map _cmds_to_keys[KC_CONTEXT_COUNT];
}
///////////////////////////////////////////////////////////////
// Keybinding stuff
#define VALID_BIND_COMMAND(cmd) (cmd > CMD_NO_CMD && cmd < CMD_MIN_SYNTHETIC)
void init_keybindings()
{
int i;
for (i = 0; _command_name_list[i].cmd != CMD_NO_CMD
&& _command_name_list[i].name != NULL; i++)
{
command_name &data = _command_name_list[i];
ASSERT(VALID_BIND_COMMAND(data.cmd));
ASSERT(_names_to_cmds.find(data.name) == _names_to_cmds.end());
ASSERT(_cmds_to_names.find(data.cmd) == _cmds_to_names.end());
_names_to_cmds[data.name] = data.cmd;
_cmds_to_names[data.cmd] = data.name;
}
ASSERT(i >= 130);
for (i = 0; _default_binding_list[i].cmd != CMD_NO_CMD
&& _default_binding_list[i].key != '\0'; i++)
{
default_binding &data = _default_binding_list[i];
ASSERT(VALID_BIND_COMMAND(data.cmd));
KeymapContext context = context_for_command(data.cmd);
ASSERT(context < KC_CONTEXT_COUNT);
key_to_cmd_map &key_map = _keys_to_cmds[context];
cmd_to_key_map &cmd_map = _cmds_to_keys[context];
// Only one command per key, but it's okay to have several
// keys map to the same command.
ASSERT(key_map.find(data.key) == key_map.end());
key_map[data.key] = data.cmd;
cmd_map[data.cmd] = data.key;
}
ASSERT(i >= 130);
}
command_type name_to_command(std::string name)
{
name_to_cmd_map::iterator it = _names_to_cmds.find(name);
if (it == _names_to_cmds.end())
return (CMD_NO_CMD);
return static_cast<command_type>(it->second);
std::string command_to_name(command_type cmd)
{
cmd_to_name_map::iterator it = _cmds_to_names.find(cmd);
if (it == _cmds_to_names.end())
return ("CMD_NO_CMD");
return (it->second);
}
command_type key_to_command(int key, KeymapContext context)
{
key_to_cmd_map &key_map = _keys_to_cmds[context];
key_to_cmd_map::iterator it = key_map.find(key);
if (it == key_map.end())
return CMD_NO_CMD;
command_type cmd = static_cast<command_type>(it->second);
ASSERT(context_for_command(cmd) == context);
return cmd;
}
int command_to_key(command_type cmd)
{
KeymapContext context = context_for_command(cmd);
if (context == KC_NONE)
return ('\0');
cmd_to_key_map &cmd_map = _cmds_to_keys[context];
cmd_to_key_map::iterator it = cmd_map.find(cmd);
if (it == cmd_map.end())
return ('\0');
return (it->second);
}
KeymapContext context_for_command(command_type cmd)
{
#ifdef USE_TILE
if (cmd >= CMD_MIN_TILE && cmd <= CMD_MAX_TILE)
return KC_TILE;
#endif
if (cmd > CMD_NO_CMD && cmd <= CMD_MAX_NORMAL)
return KC_DEFAULT;
if (cmd >= CMD_MIN_OVERMAP && cmd <= CMD_MAX_OVERMAP)
return KC_LEVELMAP;
if (cmd >= CMD_MIN_TARGET && cmd <= CMD_MAX_TARGET)
return KC_TARGETING;
return KC_NONE;
}
void bind_command_to_key(command_type cmd, int key)
{
KeymapContext context = context_for_command(cmd);
std::string command_name = command_to_name(cmd);
if (context == KC_NONE || command_name == "CMD_NO_CMD"
|| !VALID_BIND_COMMAND(cmd))
{
if (command_name == "CMD_NO_CMD")
{
mprf(MSGCH_ERROR, "Cannot bind command #%d to a key.",
(int) cmd);
return;
}
mprf(MSGCH_ERROR, "Cannot bind command '%s' to a key.",
command_name.c_str());
return;
}
if (is_userfunction(key))
{
mpr("Cannot bind user function keys to a command.", MSGCH_ERROR);
return;
}
if (is_synthetic_key(key))
{
mpr("Cannot bind synthetic keys to a command.", MSGCH_ERROR);
return;
}
// We're good.
key_to_cmd_map &key_map = _keys_to_cmds[context];
cmd_to_key_map &cmd_map = _cmds_to_keys[context];
key_map[key] = cmd;
cmd_map[cmd] = key;
}
}
}
// Not a method of the game_options class since keybindings aren't
// stored in that class.
static void _bindkey(std::string field)
{
const size_t start_bracket = field.find_first_of('[');
const size_t end_bracket = field.find_last_of(']');
if (start_bracket == std::string::npos
|| end_bracket == std::string::npos
|| start_bracket > end_bracket)
{
mprf(MSGCH_ERROR, "Bad bindkey bracketing in '%s'",
field.c_str());
return;
}
const std::string key_str = field.substr(start_bracket + 1,
end_bracket - start_bracket - 1);
int key;
// TODO: Function keys.
if (key_str.length() == 0)
{
mprf(MSGCH_ERROR, "No key in bindkey directive '%s'",
field.c_str());
return;
}
else if (key_str.length() == 1)
{
key = key_str[0];
}
else if (key_str.length() == 2)
{
if(key_str[0] != '^')
{
mprf(MSGCH_ERROR, "Invalid key '%s' in bindkey directive '%s'",
key_str.c_str(), field.c_str());
return;
}
key = CONTROL(key_str[1]);
}
else
{
mprf(MSGCH_ERROR, "Invalid key '%s' in bindkey directive '%s'",
key_str.c_str(), field.c_str());
return;
}
const size_t start_name = field.find_first_not_of(' ', end_bracket + 1);
if (start_name == std::string::npos)
{
mprf(MSGCH_ERROR, "No command name for bindkey directive '%s'",
field.c_str());
return;
}
const std::string name = field.substr(start_name);
const command_type cmd = name_to_command(name);
if (cmd == CMD_NO_CMD)
{
mprf(MSGCH_ERROR, "No command named '%s'", name.c_str());
return;
#endif
switch (key)
{
case ESCAPE:
case 'x': return CMD_TARGET_CANCEL;
#ifdef USE_TILE
case CK_MOUSE_MOVE: return CMD_TARGET_MOUSE_MOVE;
case CK_MOUSE_CLICK: return CMD_TARGET_MOUSE_SELECT;
#endif
#ifdef WIZARD
case 'F': return CMD_TARGET_WIZARD_MAKE_FRIENDLY;
case 'P': return CMD_TARGET_WIZARD_BLESS_MONSTER;
case 's': return CMD_TARGET_WIZARD_MAKE_SHOUT;
case 'g': return CMD_TARGET_WIZARD_GIVE_ITEM;
case 'm': return CMD_TARGET_WIZARD_MOVE;
case 'w': return CMD_TARGET_WIZARD_PATHFIND;
#endif
case 'v': return CMD_TARGET_DESCRIBE;
case '?': return CMD_TARGET_HELP;
case ' ': return just_looking? CMD_TARGET_CANCEL : CMD_TARGET_SELECT;
case CONTROL('P'): return CMD_TARGET_SHOW_PROMPT;
#ifdef WIZARD
case CONTROL('C'): return CMD_TARGET_CYCLE_BEAM;
case ':': return CMD_TARGET_HIDE_BEAM;
case '!': return CMD_TARGET_SELECT;
case '\r': return CMD_TARGET_SELECT;
case '5': return CMD_TARGET_SELECT;
case '.': return CMD_TARGET_SELECT_ENDPOINT;
case '\\':
case '\t': return CMD_TARGET_FIND_PORTAL;
case '^': return CMD_TARGET_FIND_TRAP;
case '_': return CMD_TARGET_FIND_ALTAR;
case '<': return CMD_TARGET_FIND_UPSTAIR;
case '>': return CMD_TARGET_FIND_DOWNSTAIR;
case CONTROL('F'): return CMD_TARGET_CYCLE_TARGET_MODE;
case CONTROL('L'): return CMD_TARGET_TOGGLE_MLIST;
case 'p': return CMD_TARGET_PREV_TARGET;
case 'f': return CMD_TARGET_MAYBE_PREV_TARGET;
case 't': return CMD_TARGET_MAYBE_PREV_TARGET; // for the 0.3.4 keys
case '-': return CMD_TARGET_CYCLE_BACK;
case '+':
case '=': return CMD_TARGET_CYCLE_FORWARD;
case ';':
case '/': return CMD_TARGET_OBJ_CYCLE_BACK;
case '*':
case '\'': return CMD_TARGET_OBJ_CYCLE_FORWARD;
case 'b': return CMD_TARGET_DOWN_LEFT;
case 'h': return CMD_TARGET_LEFT;
case 'j': return CMD_TARGET_DOWN;
case 'k': return CMD_TARGET_UP;
case 'l': return CMD_TARGET_RIGHT;
case 'n': return CMD_TARGET_DOWN_RIGHT;
case 'u': return CMD_TARGET_UP_RIGHT;
case 'y': return CMD_TARGET_UP_LEFT;
case 'B': return CMD_TARGET_DIR_DOWN_LEFT;
case 'H': return CMD_TARGET_DIR_LEFT;
case 'J': return CMD_TARGET_DIR_DOWN;
case 'K': return CMD_TARGET_DIR_UP;
case 'L': return CMD_TARGET_DIR_RIGHT;
case 'N': return CMD_TARGET_DIR_DOWN_RIGHT;
case 'U': return CMD_TARGET_DIR_UP_RIGHT;
case 'Y': return CMD_TARGET_DIR_UP_LEFT;
command_type cmd = key_to_command(key, KC_TARGETING);
// XXX: hack
if (cmd == CMD_TARGET_SELECT && key == ' ' && just_looking)
cmd = CMD_TARGET_CANCEL;
// Generated by util/cmd-name.pl
{CMD_MOVE_NOWHERE, "CMD_MOVE_NOWHERE"},
{CMD_MOVE_LEFT, "CMD_MOVE_LEFT"},
{CMD_MOVE_DOWN, "CMD_MOVE_DOWN"},
{CMD_MOVE_UP, "CMD_MOVE_UP"},
{CMD_MOVE_RIGHT, "CMD_MOVE_RIGHT"},
{CMD_MOVE_UP_LEFT, "CMD_MOVE_UP_LEFT"},
{CMD_MOVE_DOWN_LEFT, "CMD_MOVE_DOWN_LEFT"},
{CMD_MOVE_UP_RIGHT, "CMD_MOVE_UP_RIGHT"},
{CMD_MOVE_DOWN_RIGHT, "CMD_MOVE_DOWN_RIGHT"},
{CMD_RUN_LEFT, "CMD_RUN_LEFT"},
{CMD_RUN_DOWN, "CMD_RUN_DOWN"},
{CMD_RUN_UP, "CMD_RUN_UP"},
{CMD_RUN_RIGHT, "CMD_RUN_RIGHT"},
{CMD_RUN_UP_LEFT, "CMD_RUN_UP_LEFT"},
{CMD_RUN_DOWN_LEFT, "CMD_RUN_DOWN_LEFT"},
{CMD_RUN_UP_RIGHT, "CMD_RUN_UP_RIGHT"},
{CMD_RUN_DOWN_RIGHT, "CMD_RUN_DOWN_RIGHT"},
{CMD_OPEN_DOOR_LEFT, "CMD_OPEN_DOOR_LEFT"},
{CMD_OPEN_DOOR_DOWN, "CMD_OPEN_DOOR_DOWN"},
{CMD_OPEN_DOOR_UP, "CMD_OPEN_DOOR_UP"},
{CMD_OPEN_DOOR_RIGHT, "CMD_OPEN_DOOR_RIGHT"},
{CMD_OPEN_DOOR_UP_LEFT, "CMD_OPEN_DOOR_UP_LEFT"},
{CMD_OPEN_DOOR_DOWN_LEFT, "CMD_OPEN_DOOR_DOWN_LEFT"},
{CMD_OPEN_DOOR_UP_RIGHT, "CMD_OPEN_DOOR_UP_RIGHT"},
{CMD_OPEN_DOOR_DOWN_RIGHT, "CMD_OPEN_DOOR_DOWN_RIGHT"},
{CMD_OPEN_DOOR, "CMD_OPEN_DOOR"},
{CMD_CLOSE_DOOR, "CMD_CLOSE_DOOR"},
{CMD_REST, "CMD_REST"},
{CMD_GO_UPSTAIRS, "CMD_GO_UPSTAIRS"},
{CMD_GO_DOWNSTAIRS, "CMD_GO_DOWNSTAIRS"},
{CMD_TOGGLE_AUTOPICKUP, "CMD_TOGGLE_AUTOPICKUP"},
{CMD_TOGGLE_FRIENDLY_PICKUP, "CMD_TOGGLE_FRIENDLY_PICKUP"},
{CMD_PICKUP, "CMD_PICKUP"},
{CMD_DROP, "CMD_DROP"},
{CMD_BUTCHER, "CMD_BUTCHER"},
{CMD_INSPECT_FLOOR, "CMD_INSPECT_FLOOR"},
{CMD_FULL_VIEW, "CMD_FULL_VIEW"},
{CMD_EXAMINE_OBJECT, "CMD_EXAMINE_OBJECT"},
{CMD_EVOKE, "CMD_EVOKE"},
{CMD_WIELD_WEAPON, "CMD_WIELD_WEAPON"},
{CMD_WEAPON_SWAP, "CMD_WEAPON_SWAP"},
{CMD_FIRE, "CMD_FIRE"},
{CMD_QUIVER_ITEM, "CMD_QUIVER_ITEM"},
{CMD_THROW_ITEM_NO_QUIVER, "CMD_THROW_ITEM_NO_QUIVER"},
{CMD_WEAR_ARMOUR, "CMD_WEAR_ARMOUR"},
{CMD_REMOVE_ARMOUR, "CMD_REMOVE_ARMOUR"},
{CMD_WEAR_JEWELLERY, "CMD_WEAR_JEWELLERY"},
{CMD_REMOVE_JEWELLERY, "CMD_REMOVE_JEWELLERY"},
{CMD_CYCLE_QUIVER_FORWARD, "CMD_CYCLE_QUIVER_FORWARD"},
{CMD_LIST_WEAPONS, "CMD_LIST_WEAPONS"},
{CMD_LIST_ARMOUR, "CMD_LIST_ARMOUR"},
{CMD_LIST_JEWELLERY, "CMD_LIST_JEWELLERY"},
{CMD_LIST_EQUIPMENT, "CMD_LIST_EQUIPMENT"},
{CMD_ZAP_WAND, "CMD_ZAP_WAND"},
{CMD_CAST_SPELL, "CMD_CAST_SPELL"},
{CMD_MEMORISE_SPELL, "CMD_MEMORISE_SPELL"},
{CMD_USE_ABILITY, "CMD_USE_ABILITY"},
{CMD_PRAY, "CMD_PRAY"},
{CMD_EAT, "CMD_EAT"},
{CMD_QUAFF, "CMD_QUAFF"},
{CMD_READ, "CMD_READ"},
{CMD_LOOK_AROUND, "CMD_LOOK_AROUND"},
{CMD_SEARCH, "CMD_SEARCH"},
{CMD_SHOUT, "CMD_SHOUT"},
{CMD_DISARM_TRAP, "CMD_DISARM_TRAP"},
{CMD_CHARACTER_DUMP, "CMD_CHARACTER_DUMP"},
{CMD_DISPLAY_COMMANDS, "CMD_DISPLAY_COMMANDS"},
{CMD_DISPLAY_INVENTORY, "CMD_DISPLAY_INVENTORY"},
{CMD_DISPLAY_KNOWN_OBJECTS, "CMD_DISPLAY_KNOWN_OBJECTS"},
{CMD_DISPLAY_MUTATIONS, "CMD_DISPLAY_MUTATIONS"},
{CMD_DISPLAY_SKILLS, "CMD_DISPLAY_SKILLS"},
{CMD_DISPLAY_MAP, "CMD_DISPLAY_MAP"},
{CMD_DISPLAY_OVERMAP, "CMD_DISPLAY_OVERMAP"},
{CMD_DISPLAY_RELIGION, "CMD_DISPLAY_RELIGION"},
{CMD_DISPLAY_CHARACTER_STATUS, "CMD_DISPLAY_CHARACTER_STATUS"},
{CMD_DISPLAY_SPELLS, "CMD_DISPLAY_SPELLS"},
{CMD_EXPERIENCE_CHECK, "CMD_EXPERIENCE_CHECK"},
{CMD_ADJUST_INVENTORY, "CMD_ADJUST_INVENTORY"},
{CMD_REPLAY_MESSAGES, "CMD_REPLAY_MESSAGES"},
{CMD_REDRAW_SCREEN, "CMD_REDRAW_SCREEN"},
{CMD_MACRO_ADD, "CMD_MACRO_ADD"},
{CMD_SAVE_GAME, "CMD_SAVE_GAME"},
{CMD_SAVE_GAME_NOW, "CMD_SAVE_GAME_NOW"},
{CMD_SUSPEND_GAME, "CMD_SUSPEND_GAME"},
{CMD_QUIT, "CMD_QUIT"},
{CMD_WIZARD, "CMD_WIZARD"},
{CMD_DESTROY_ITEM, "CMD_DESTROY_ITEM"},
{CMD_MARK_STASH, "CMD_MARK_STASH"},
{CMD_FORGET_STASH, "CMD_FORGET_STASH"},
{CMD_SEARCH_STASHES, "CMD_SEARCH_STASHES"},
{CMD_EXPLORE, "CMD_EXPLORE"},
{CMD_INTERLEVEL_TRAVEL, "CMD_INTERLEVEL_TRAVEL"},
{CMD_FIX_WAYPOINT, "CMD_FIX_WAYPOINT"},
{CMD_CLEAR_MAP, "CMD_CLEAR_MAP"},
{CMD_INSCRIBE_ITEM, "CMD_INSCRIBE_ITEM"},
{CMD_MAKE_NOTE, "CMD_MAKE_NOTE"},
{CMD_RESISTS_SCREEN, "CMD_RESISTS_SCREEN"},
{CMD_READ_MESSAGES, "CMD_READ_MESSAGES"},
{CMD_MOUSE_MOVE, "CMD_MOUSE_MOVE"},
{CMD_MOUSE_CLICK, "CMD_MOUSE_CLICK"},
{CMD_ANNOTATE_LEVEL, "CMD_ANNOTATE_LEVEL"},
{CMD_PREV_CMD_AGAIN, "CMD_PREV_CMD_AGAIN"},
{CMD_REPEAT_CMD, "CMD_REPEAT_CMD"},
{CMD_MAP_CLEAR_MAP, "CMD_MAP_CLEAR_MAP"},
{CMD_MAP_ADD_WAYPOINT, "CMD_MAP_ADD_WAYPOINT"},
{CMD_MAP_EXCLUDE_AREA, "CMD_MAP_EXCLUDE_AREA"},
{CMD_MAP_CLEAR_EXCLUDES, "CMD_MAP_CLEAR_EXCLUDES"},
{CMD_MAP_MOVE_LEFT, "CMD_MAP_MOVE_LEFT"},
{CMD_MAP_MOVE_DOWN, "CMD_MAP_MOVE_DOWN"},
{CMD_MAP_MOVE_UP, "CMD_MAP_MOVE_UP"},
{CMD_MAP_MOVE_RIGHT, "CMD_MAP_MOVE_RIGHT"},
{CMD_MAP_MOVE_UP_LEFT, "CMD_MAP_MOVE_UP_LEFT"},
{CMD_MAP_MOVE_DOWN_LEFT, "CMD_MAP_MOVE_DOWN_LEFT"},
{CMD_MAP_MOVE_UP_RIGHT, "CMD_MAP_MOVE_UP_RIGHT"},
{CMD_MAP_MOVE_DOWN_RIGHT, "CMD_MAP_MOVE_DOWN_RIGHT"},
{CMD_MAP_JUMP_LEFT, "CMD_MAP_JUMP_LEFT"},
{CMD_MAP_JUMP_DOWN, "CMD_MAP_JUMP_DOWN"},
{CMD_MAP_JUMP_UP, "CMD_MAP_JUMP_UP"},
{CMD_MAP_JUMP_RIGHT, "CMD_MAP_JUMP_RIGHT"},
{CMD_MAP_JUMP_UP_LEFT, "CMD_MAP_JUMP_UP_LEFT"},
{CMD_MAP_JUMP_DOWN_LEFT, "CMD_MAP_JUMP_DOWN_LEFT"},
{CMD_MAP_JUMP_UP_RIGHT, "CMD_MAP_JUMP_UP_RIGHT"},
{CMD_MAP_JUMP_DOWN_RIGHT, "CMD_MAP_JUMP_DOWN_RIGHT"},
{CMD_MAP_SCROLL_DOWN, "CMD_MAP_SCROLL_DOWN"},
{CMD_MAP_SCROLL_UP, "CMD_MAP_SCROLL_UP"},
{CMD_MAP_FIND_UPSTAIR, "CMD_MAP_FIND_UPSTAIR"},
{CMD_MAP_FIND_DOWNSTAIR, "CMD_MAP_FIND_DOWNSTAIR"},
{CMD_MAP_FIND_YOU, "CMD_MAP_FIND_YOU"},
{CMD_MAP_FIND_PORTAL, "CMD_MAP_FIND_PORTAL"},
{CMD_MAP_FIND_TRAP, "CMD_MAP_FIND_TRAP"},
{CMD_MAP_FIND_ALTAR, "CMD_MAP_FIND_ALTAR"},
{CMD_MAP_FIND_EXCLUDED, "CMD_MAP_FIND_EXCLUDED"},
{CMD_MAP_FIND_F, "CMD_MAP_FIND_F"},
{CMD_MAP_FIND_WAYPOINT, "CMD_MAP_FIND_WAYPOINT"},
{CMD_MAP_FIND_STASH, "CMD_MAP_FIND_STASH"},
{CMD_MAP_GOTO_TARGET, "CMD_MAP_GOTO_TARGET"},
{CMD_MAP_WIZARD_TELEPORT, "CMD_MAP_WIZARD_TELEPORT"},
{CMD_MAP_EXIT_MAP, "CMD_MAP_EXIT_MAP"},
{CMD_TARGET_DOWN_LEFT, "CMD_TARGET_DOWN_LEFT"},
{CMD_TARGET_DOWN, "CMD_TARGET_DOWN"},
{CMD_TARGET_DOWN_RIGHT, "CMD_TARGET_DOWN_RIGHT"},
{CMD_TARGET_LEFT, "CMD_TARGET_LEFT"},
{CMD_TARGET_RIGHT, "CMD_TARGET_RIGHT"},
{CMD_TARGET_UP_LEFT, "CMD_TARGET_UP_LEFT"},
{CMD_TARGET_UP, "CMD_TARGET_UP"},
{CMD_TARGET_UP_RIGHT, "CMD_TARGET_UP_RIGHT"},
{CMD_TARGET_DIR_DOWN_LEFT, "CMD_TARGET_DIR_DOWN_LEFT"},
{CMD_TARGET_DIR_DOWN, "CMD_TARGET_DIR_DOWN"},
{CMD_TARGET_DIR_DOWN_RIGHT, "CMD_TARGET_DIR_DOWN_RIGHT"},
{CMD_TARGET_DIR_LEFT, "CMD_TARGET_DIR_LEFT"},
{CMD_TARGET_DIR_RIGHT, "CMD_TARGET_DIR_RIGHT"},
{CMD_TARGET_DIR_UP_LEFT, "CMD_TARGET_DIR_UP_LEFT"},
{CMD_TARGET_DIR_UP, "CMD_TARGET_DIR_UP"},
{CMD_TARGET_DIR_UP_RIGHT, "CMD_TARGET_DIR_UP_RIGHT"},
{CMD_TARGET_CYCLE_TARGET_MODE, "CMD_TARGET_CYCLE_TARGET_MODE"},
{CMD_TARGET_PREV_TARGET, "CMD_TARGET_PREV_TARGET"},
{CMD_TARGET_MAYBE_PREV_TARGET, "CMD_TARGET_MAYBE_PREV_TARGET"},
{CMD_TARGET_SELECT, "CMD_TARGET_SELECT"},
{CMD_TARGET_SELECT_ENDPOINT, "CMD_TARGET_SELECT_ENDPOINT"},
{CMD_TARGET_OBJ_CYCLE_BACK, "CMD_TARGET_OBJ_CYCLE_BACK"},
{CMD_TARGET_OBJ_CYCLE_FORWARD, "CMD_TARGET_OBJ_CYCLE_FORWARD"},
{CMD_TARGET_CYCLE_FORWARD, "CMD_TARGET_CYCLE_FORWARD"},
{CMD_TARGET_CYCLE_BACK, "CMD_TARGET_CYCLE_BACK"},
{CMD_TARGET_CYCLE_BEAM, "CMD_TARGET_CYCLE_BEAM"},
{CMD_TARGET_CYCLE_MLIST, "CMD_TARGET_CYCLE_MLIST"},
{CMD_TARGET_CYCLE_MLIST_END, "CMD_TARGET_CYCLE_MLIST_END"},
{CMD_TARGET_TOGGLE_MLIST, "CMD_TARGET_TOGGLE_MLIST"},
{CMD_TARGET_HIDE_BEAM, "CMD_TARGET_HIDE_BEAM"},
{CMD_TARGET_CENTER, "CMD_TARGET_CENTER"},
{CMD_TARGET_CANCEL, "CMD_TARGET_CANCEL"},
{CMD_TARGET_SHOW_PROMPT, "CMD_TARGET_SHOW_PROMPT"},
{CMD_TARGET_OLD_SPACE, "CMD_TARGET_OLD_SPACE"},
{CMD_TARGET_FIND_TRAP, "CMD_TARGET_FIND_TRAP"},
{CMD_TARGET_FIND_PORTAL, "CMD_TARGET_FIND_PORTAL"},
{CMD_TARGET_FIND_ALTAR, "CMD_TARGET_FIND_ALTAR"},
{CMD_TARGET_FIND_UPSTAIR, "CMD_TARGET_FIND_UPSTAIR"},
{CMD_TARGET_FIND_DOWNSTAIR, "CMD_TARGET_FIND_DOWNSTAIR"},
{CMD_TARGET_FIND_YOU, "CMD_TARGET_FIND_YOU"},
{CMD_TARGET_DESCRIBE, "CMD_TARGET_DESCRIBE"},
{CMD_TARGET_WIZARD_MAKE_FRIENDLY, "CMD_TARGET_WIZARD_MAKE_FRIENDLY"},
{CMD_TARGET_WIZARD_BLESS_MONSTER, "CMD_TARGET_WIZARD_BLESS_MONSTER"},
{CMD_TARGET_WIZARD_MAKE_SHOUT, "CMD_TARGET_WIZARD_MAKE_SHOUT"},
{CMD_TARGET_WIZARD_GIVE_ITEM, "CMD_TARGET_WIZARD_GIVE_ITEM"},
{CMD_TARGET_WIZARD_MOVE, "CMD_TARGET_WIZARD_MOVE"},
{CMD_TARGET_WIZARD_PATHFIND, "CMD_TARGET_WIZARD_PATHFIND"},
{CMD_TARGET_HELP, "CMD_TARGET_HELP"},
#ifdef USE_TILE
{CMD_TARGET_MOUSE_MOVE, "CMD_TARGET_MOUSE_MOVE"},
{CMD_TARGET_MOUSE_SELECT, "CMD_TARGET_MOUSE_SELECT"},
{CMD_EDIT_PLAYER_TILE, "CMD_EDIT_PLAYER_TILE"},
#endif
{CMD_NO_CMD, NULL}
#ifdef USE_TILE
{'-', CMD_EDIT_PLAYER_TILE},
#endif
{'b', CMD_MOVE_DOWN_LEFT},
{'h', CMD_MOVE_LEFT},
{'j', CMD_MOVE_DOWN},
{'k', CMD_MOVE_UP},
{'l', CMD_MOVE_RIGHT},
{'n', CMD_MOVE_DOWN_RIGHT},
{'u', CMD_MOVE_UP_RIGHT},
{'y', CMD_MOVE_UP_LEFT},
{'a', CMD_USE_ABILITY},
{'c', CMD_BUTCHER},
{'d', CMD_DROP},
{'e', CMD_EAT},
{'f', CMD_FIRE},
{'g', CMD_PICKUP},
{'i', CMD_DISPLAY_INVENTORY},
{'m', CMD_DISPLAY_SKILLS},
{'o', CMD_EXPLORE},
{'p', CMD_PRAY},
{'q', CMD_QUAFF},
{'r', CMD_READ},
{'s', CMD_SEARCH},
{'t', CMD_SHOUT},
{'v', CMD_EVOKE},
{'w', CMD_WIELD_WEAPON},
{'x', CMD_LOOK_AROUND},
{'z', CMD_CAST_SPELL},
{'B', CMD_RUN_DOWN_LEFT},
{'H', CMD_RUN_LEFT},
{'J', CMD_RUN_DOWN},
{'K', CMD_RUN_UP},
{'L', CMD_RUN_RIGHT},
{'N', CMD_RUN_DOWN_RIGHT},
{'U', CMD_RUN_UP_RIGHT},
{'Y', CMD_RUN_UP_LEFT},
{'A', CMD_DISPLAY_MUTATIONS},
{'C', CMD_CLOSE_DOOR},
{'E', CMD_EXPERIENCE_CHECK},
{'F', CMD_THROW_ITEM_NO_QUIVER},
{'G', CMD_INTERLEVEL_TRAVEL},
{CONTROL('G'), CMD_INTERLEVEL_TRAVEL},
{'I', CMD_DISPLAY_SPELLS},
{'M', CMD_MEMORISE_SPELL},
{'O', CMD_OPEN_DOOR},
{'P', CMD_WEAR_JEWELLERY},
{'Q', CMD_QUIVER_ITEM},
{'R', CMD_REMOVE_JEWELLERY},
{'S', CMD_SAVE_GAME},
{'T', CMD_REMOVE_ARMOUR},
{'V', CMD_FULL_VIEW},
{'W', CMD_WEAR_ARMOUR},
{'X', CMD_DISPLAY_MAP},
{'Z', CMD_ZAP_WAND},
{'.', CMD_MOVE_NOWHERE},
{'<', CMD_GO_UPSTAIRS},
{'>', CMD_GO_DOWNSTAIRS},
{'@', CMD_DISPLAY_CHARACTER_STATUS},
{'%', CMD_RESISTS_SCREEN},
{',', CMD_PICKUP},
{':', CMD_MAKE_NOTE},
{'_', CMD_READ_MESSAGES},
{';', CMD_INSPECT_FLOOR},
{'^', CMD_DISPLAY_RELIGION},
{'#', CMD_CHARACTER_DUMP},
{'=', CMD_ADJUST_INVENTORY},
{'?', CMD_DISPLAY_COMMANDS},
{'!', CMD_ANNOTATE_LEVEL},
{CONTROL('D'), CMD_MACRO_ADD},
{'~', CMD_MACRO_ADD},
#ifdef WIZARD
{'&', CMD_WIZARD},
#endif
{'"', CMD_LIST_JEWELLERY},
{'{', CMD_INSCRIBE_ITEM},
{'[', CMD_LIST_ARMOUR},
{']', CMD_LIST_EQUIPMENT},
{'(', CMD_CYCLE_QUIVER_FORWARD},
{')', CMD_LIST_WEAPONS},
{'\\', CMD_DISPLAY_KNOWN_OBJECTS},
{'\'', CMD_WEAPON_SWAP},
{'`', CMD_PREV_CMD_AGAIN},
{'0', CMD_REPEAT_CMD},
{'5', CMD_REST},
{CONTROL('B'), CMD_OPEN_DOOR_DOWN_LEFT},
{CONTROL('H'), CMD_OPEN_DOOR_LEFT},
{CONTROL('J'), CMD_OPEN_DOOR_DOWN},
{CONTROL('K'), CMD_OPEN_DOOR_UP},
{CONTROL('L'), CMD_OPEN_DOOR_RIGHT},
{CONTROL('N'), CMD_OPEN_DOOR_DOWN_RIGHT},
{CONTROL('U'), CMD_OPEN_DOOR_UP_LEFT},
{CONTROL('Y'), CMD_OPEN_DOOR_UP_RIGHT},
{CONTROL('A'), CMD_TOGGLE_AUTOPICKUP},
{CONTROL('C'), CMD_CLEAR_MAP},
{CONTROL('E'), CMD_FORGET_STASH},
{CONTROL('F'), CMD_SEARCH_STASHES},
{CONTROL('O'), CMD_DISPLAY_OVERMAP},
{CONTROL('P'), CMD_REPLAY_MESSAGES},
{CONTROL('Q'), CMD_QUIT},
{CONTROL('R'), CMD_REDRAW_SCREEN},
{CONTROL('S'), CMD_MARK_STASH},
{CONTROL('T'), CMD_TOGGLE_FRIENDLY_PICKUP},
{CONTROL('W'), CMD_FIX_WAYPOINT},
{CONTROL('X'), CMD_SAVE_GAME_NOW},
{CONTROL('Z'), CMD_SUSPEND_GAME},
{'x', CMD_TARGET_CANCEL},
{ESCAPE, CMD_TARGET_CANCEL},
#ifdef WIZARD
{'F', CMD_TARGET_WIZARD_MAKE_FRIENDLY},
{'P', CMD_TARGET_WIZARD_BLESS_MONSTER},
{'s', CMD_TARGET_WIZARD_MAKE_SHOUT},
{'g', CMD_TARGET_WIZARD_GIVE_ITEM},
{'m', CMD_TARGET_WIZARD_MOVE},
{'w', CMD_TARGET_WIZARD_PATHFIND},
#endif
{'v', CMD_TARGET_DESCRIBE},
{'?', CMD_TARGET_HELP},
{' ', CMD_TARGET_SELECT}, // XXX hack: can also be CMD_TARGET_CANCEL
{CONTROL('P'), CMD_TARGET_SHOW_PROMPT},
{CONTROL('C'), CMD_TARGET_CYCLE_BEAM},
{':', CMD_TARGET_HIDE_BEAM},
{'!', CMD_TARGET_SELECT},
{'\r', CMD_TARGET_SELECT},
{'5', CMD_TARGET_SELECT},
{'.', CMD_TARGET_SELECT_ENDPOINT},
{'\t', CMD_TARGET_FIND_PORTAL},
{'^', CMD_TARGET_FIND_TRAP},
{'_', CMD_TARGET_FIND_ALTAR},
{'<', CMD_TARGET_FIND_UPSTAIR},
{'>', CMD_TARGET_FIND_DOWNSTAIR},
{CONTROL('F'), CMD_TARGET_CYCLE_TARGET_MODE},
{CONTROL('L'), CMD_TARGET_TOGGLE_MLIST},
{'p', CMD_TARGET_PREV_TARGET},
{'f', CMD_TARGET_MAYBE_PREV_TARGET},
{'t', CMD_TARGET_MAYBE_PREV_TARGET},
{'-', CMD_TARGET_CYCLE_BACK},
{'=', CMD_TARGET_CYCLE_FORWARD},
{'/', CMD_TARGET_OBJ_CYCLE_BACK},
{'\'', CMD_TARGET_OBJ_CYCLE_FORWARD},
{'b', CMD_TARGET_DOWN_LEFT},
{'h', CMD_TARGET_LEFT},
{'j', CMD_TARGET_DOWN},
{'k', CMD_TARGET_UP},
{'l', CMD_TARGET_RIGHT},
{'n', CMD_TARGET_DOWN_RIGHT},
{'u', CMD_TARGET_UP_RIGHT},
{'y', CMD_TARGET_UP_LEFT},
{'B', CMD_TARGET_DIR_DOWN_LEFT},
{'H', CMD_TARGET_DIR_LEFT},
{'J', CMD_TARGET_DIR_DOWN},
{'K', CMD_TARGET_DIR_UP},
{'L', CMD_TARGET_DIR_RIGHT},
{'N', CMD_TARGET_DIR_DOWN_RIGHT},
{'U', CMD_TARGET_DIR_UP_RIGHT},
{'Y', CMD_TARGET_DIR_UP_LEFT},
{CK_MOUSE_MOVE, CMD_MOUSE_MOVE},
{CK_MOUSE_CLICK, CMD_MOUSE_CLICK},
#ifdef USE_TILE
{CK_MOUSE_MOVE, CMD_TARGET_MOUSE_MOVE},
{CK_MOUSE_CLICK, CMD_TARGET_MOUSE_SELECT},
#endif
{'\0', CMD_NO_CMD}
case 'b': return CMD_MOVE_DOWN_LEFT;
case 'h': return CMD_MOVE_LEFT;
case 'j': return CMD_MOVE_DOWN;
case 'k': return CMD_MOVE_UP;
case 'l': return CMD_MOVE_RIGHT;
case 'n': return CMD_MOVE_DOWN_RIGHT;
case 'u': return CMD_MOVE_UP_RIGHT;
case 'y': return CMD_MOVE_UP_LEFT;
case 'a': return CMD_USE_ABILITY;
case 'c': return CMD_BUTCHER;
case 'd': return CMD_DROP;
case 'e': return CMD_EAT;
case 'f': return CMD_FIRE;
case 'g': return CMD_PICKUP;
case 'i': return CMD_DISPLAY_INVENTORY;
case 'm': return CMD_DISPLAY_SKILLS;
case 'o': return CMD_EXPLORE;
case 'p': return CMD_PRAY;
case 'q': return CMD_QUAFF;
case 'r': return CMD_READ;
case 's': return CMD_SEARCH;
case 't': return CMD_SHOUT;
case 'v': return CMD_EVOKE;
case 'w': return CMD_WIELD_WEAPON;
case 'x': return CMD_LOOK_AROUND;
case 'z': return CMD_CAST_SPELL;
case 'B': return CMD_RUN_DOWN_LEFT;
case 'H': return CMD_RUN_LEFT;
case 'J': return CMD_RUN_DOWN;
case 'K': return CMD_RUN_UP;
case 'L': return CMD_RUN_RIGHT;
case 'N': return CMD_RUN_DOWN_RIGHT;
case 'U': return CMD_RUN_UP_RIGHT;
case 'Y': return CMD_RUN_UP_LEFT;
case 'A': return CMD_DISPLAY_MUTATIONS;
case 'C': return CMD_CLOSE_DOOR;
case 'D': return CMD_NO_CMD;
case 'E': return CMD_EXPERIENCE_CHECK;
case 'F': return CMD_THROW_ITEM_NO_QUIVER;
case CONTROL('G'):
case 'G': return CMD_INTERLEVEL_TRAVEL;
case 'I': return CMD_DISPLAY_SPELLS;
case 'M': return CMD_MEMORISE_SPELL;
case 'O': return CMD_OPEN_DOOR;
case 'P': return CMD_WEAR_JEWELLERY;
case 'Q': return CMD_QUIVER_ITEM;
case 'R': return CMD_REMOVE_JEWELLERY;
case 'S': return CMD_SAVE_GAME;
case 'T': return CMD_REMOVE_ARMOUR;
case 'V': return CMD_FULL_VIEW;
case 'W': return CMD_WEAR_ARMOUR;
case 'X': return CMD_DISPLAY_MAP;
case 'Z': return CMD_ZAP_WAND;
case '.': return CMD_MOVE_NOWHERE;
case '<': return CMD_GO_UPSTAIRS;
case '>': return CMD_GO_DOWNSTAIRS;
case '@': return CMD_DISPLAY_CHARACTER_STATUS;
case '%': return CMD_RESISTS_SCREEN;
case ',': return CMD_PICKUP;
case ':': return CMD_MAKE_NOTE;
case '_': return CMD_READ_MESSAGES;
case ';': return CMD_INSPECT_FLOOR;
case '^': return CMD_DISPLAY_RELIGION;
case '#': return CMD_CHARACTER_DUMP;
case '=': return CMD_ADJUST_INVENTORY;
case '?': return CMD_DISPLAY_COMMANDS;
case '!': return CMD_ANNOTATE_LEVEL;
case CONTROL('D'):
case '~': return CMD_MACRO_ADD;
case '&': return CMD_WIZARD;
case '"': return CMD_LIST_JEWELLERY;
case '{': return CMD_INSCRIBE_ITEM;
case '[': return CMD_LIST_ARMOUR;
case ']': return CMD_LIST_EQUIPMENT;
case '(': return CMD_CYCLE_QUIVER_FORWARD;
case ')': return CMD_LIST_WEAPONS;
case '\\': return CMD_DISPLAY_KNOWN_OBJECTS;
case '\'': return CMD_WEAPON_SWAP;
case '`': return CMD_PREV_CMD_AGAIN;
case '0': return CMD_REPEAT_CMD;
case '5': return CMD_REST;
case CONTROL('B'): return CMD_OPEN_DOOR_DOWN_LEFT;
case CONTROL('H'): return CMD_OPEN_DOOR_LEFT;
case CONTROL('J'): return CMD_OPEN_DOOR_DOWN;
case CONTROL('K'): return CMD_OPEN_DOOR_UP;
case CONTROL('L'): return CMD_OPEN_DOOR_RIGHT;
case CONTROL('N'): return CMD_OPEN_DOOR_DOWN_RIGHT;
case CONTROL('U'): return CMD_OPEN_DOOR_UP_LEFT;
case CONTROL('Y'): return CMD_OPEN_DOOR_UP_RIGHT;
case CONTROL('A'): return CMD_TOGGLE_AUTOPICKUP;
case CONTROL('C'): return CMD_CLEAR_MAP;
case CONTROL('E'): return CMD_FORGET_STASH;
case CONTROL('F'): return CMD_SEARCH_STASHES;
case CONTROL('I'): return CMD_NO_CMD; // Tab on most systems
case CONTROL('M'): return CMD_NO_CMD; // Enter on most systems
case CONTROL('O'): return CMD_DISPLAY_OVERMAP;
case CONTROL('P'): return CMD_REPLAY_MESSAGES;
case CONTROL('Q'): return CMD_QUIT;
case CONTROL('R'): return CMD_REDRAW_SCREEN;
case CONTROL('S'): return CMD_MARK_STASH;
case CONTROL('T'): return CMD_TOGGLE_FRIENDLY_PICKUP;
case CONTROL('V'): return CMD_NO_CMD;
case CONTROL('W'): return CMD_FIX_WAYPOINT;
case CONTROL('X'): return CMD_SAVE_GAME_NOW;
case CONTROL('Z'): return CMD_SUSPEND_GAME;
case CK_MOUSE_MOVE: return CMD_MOUSE_MOVE;
case CK_MOUSE_CLICK: return CMD_MOUSE_CLICK;
default: return CMD_NO_CMD;
default:
return key_to_command(key, KC_DEFAULT);
# get the same functionality by pressing the item slot in the inventor.
# annotate level (Ctrl-I)
M:\{9}
A:!
# auto-explore (Ctrl-O)
M:\{15}
A:o
# shout/tell allies
M:!
A:t
# experience information
M:C
A:E
# evoke
M:E
A:v
# dungeon overview
M:O
A:\{15}
# cast spell
M:Z
A:z
# get the same functionality by pressing the item slot while looking at
# you inventory.
# close door
M:c
A:C
# open door
M:o
A:O
# throw
M:t
A:fi
# zap wand
M:z
A:Z
# butcher
M:D
A:c
bindkey = [^I] CMD_ANNOTATE_LEVEL
bindkey = [^O] CMD_EXPLORE
bindkey = [!] CMD_SHOUT
bindkey = [C] CMD_EXPERIENCE_CHECK
bindkey = [E] CMD_EVOKE
bindkey = [O] CMD_DISPLAY_OVERMAP
bindkey = [Z] CMD_CAST_SPELL
bindkey = [z] CMD_ZAP_WAND
bindkey = [c] CMD_CLOSE_DOOR
bindkey = [o] CMD_OPEN_DOOR
bindkey = [D] CMD_BUTCHER
bindkey = [t] CMD_FIRE