summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/acr.cc125
-rw-r--r--crawl-ref/source/cmd-keys.h166
-rw-r--r--crawl-ref/source/cmd-name.h195
-rw-r--r--crawl-ref/source/directn.cc76
-rw-r--r--crawl-ref/source/enum.h27
-rw-r--r--crawl-ref/source/initfile.cc76
-rw-r--r--crawl-ref/source/macro.cc195
-rw-r--r--crawl-ref/source/macro.h17
-rwxr-xr-xcrawl-ref/source/util/cmd-name.pl76
9 files changed, 756 insertions, 197 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index a18ec6ec24..2768627d18 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -217,6 +217,8 @@ int main( int argc, char *argv[] )
{
_compile_time_asserts(); // Just to quiet "unused static function" warning.
+ // Hardcoded initial keybindings.
+ init_keybindings();
// Load in the system environment variables
get_system_environment();
@@ -3394,135 +3396,22 @@ static command_type _get_next_cmd()
return _keycode_to_command(keyin);
}
-// For now, this is an extremely yucky hack.
+// We handle the synthetic keys, key_to_command() handles the
+// real ones.
static command_type _keycode_to_command( keycode_type key )
{
switch ( key )
{
#ifdef USE_TILE
- case '-': return CMD_EDIT_PLAYER_TILE;
case CK_MOUSE_CMD: return CMD_NEXT_CMD;
#endif
case KEY_MACRO_DISABLE_MORE: return CMD_DISABLE_MORE;
case KEY_MACRO_ENABLE_MORE: return CMD_ENABLE_MORE;
case KEY_REPEAT_KEYS: return CMD_REPEAT_KEYS;
- 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);
}
}
diff --git a/crawl-ref/source/cmd-keys.h b/crawl-ref/source/cmd-keys.h
new file mode 100644
index 0000000000..259915380b
--- /dev/null
+++ b/crawl-ref/source/cmd-keys.h
@@ -0,0 +1,166 @@
+#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}
diff --git a/crawl-ref/source/cmd-name.h b/crawl-ref/source/cmd-name.h
new file mode 100644
index 0000000000..5a537d8747
--- /dev/null
+++ b/crawl-ref/source/cmd-name.h
@@ -0,0 +1,195 @@
+// 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}
diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc
index c16b552c6b..00f1a45d5e 100644
--- a/crawl-ref/source/directn.cc
+++ b/crawl-ref/source/directn.cc
@@ -2710,78 +2710,12 @@ command_type targeting_behaviour::get_command(int key)
return static_cast<command_type> (CMD_TARGET_CYCLE_MLIST + (key - 'a'));
#endif
- switch (key)
- {
- case ESCAPE:
- case 'x': return CMD_TARGET_CANCEL;
+ command_type cmd = key_to_command(key, KC_TARGETING);
+ // XXX: hack
+ if (cmd == CMD_TARGET_SELECT && key == ' ' && just_looking)
+ cmd = 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;
-#endif
- 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;
-
- default: return CMD_NO_CMD;
- }
+ return cmd;
}
bool targeting_behaviour::should_redraw()
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index b445dda5e7..a64e47be70 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -514,8 +514,17 @@ enum command_type
CMD_ANNOTATE_LEVEL,
+ // Repeat previous command
+ CMD_PREV_CMD_AGAIN,
+
+ // Repeat next command a given number of times
+ CMD_REPEAT_CMD,
+
+ CMD_MAX_NORMAL = CMD_REPEAT_CMD,
+
// overmap commands
CMD_MAP_CLEAR_MAP,
+ CMD_MIN_OVERMAP = CMD_MAP_CLEAR_MAP,
CMD_MAP_ADD_WAYPOINT,
CMD_MAP_EXCLUDE_AREA,
CMD_MAP_CLEAR_EXCLUDES,
@@ -558,8 +567,11 @@ enum command_type
CMD_MAP_EXIT_MAP,
+ CMD_MAX_OVERMAP = CMD_MAP_EXIT_MAP,
+
// targeting commands
CMD_TARGET_DOWN_LEFT,
+ CMD_MIN_TARGET = CMD_TARGET_DOWN_LEFT,
CMD_TARGET_DOWN,
CMD_TARGET_DOWN_RIGHT,
CMD_TARGET_LEFT,
@@ -609,29 +621,30 @@ enum command_type
CMD_TARGET_WIZARD_MOVE,
CMD_TARGET_WIZARD_PATHFIND,
CMD_TARGET_HELP,
+ CMD_MAX_TARGET = CMD_TARGET_HELP,
#ifdef USE_TILE
CMD_TARGET_MOUSE_MOVE,
+ CMD_MIN_TILE = CMD_TARGET_MOUSE_MOVE,
CMD_TARGET_MOUSE_SELECT,
CMD_EDIT_PLAYER_TILE,
+ CMD_MAX_TILE = CMD_EDIT_PLAYER_TILE,
#endif
// Disable/enable -more- prompts.
CMD_DISABLE_MORE,
+ CMD_MIN_SYNTHETIC = CMD_DISABLE_MORE,
CMD_ENABLE_MORE,
// [ds] Silently ignored, requests another round of input.
CMD_NEXT_CMD,
- // Repeat previous command
- CMD_PREV_CMD_AGAIN,
-
- // Repeat next command a given number of times
- CMD_REPEAT_CMD,
-
// Stick the keyspresses of the command to be repeated into the
// input buffer.
- CMD_REPEAT_KEYS
+ CMD_REPEAT_KEYS,
+
+ // Must always be last
+ CMD_MAX_CMD
};
enum conduct_type
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index 14f7e5536a..947065149b 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -36,6 +36,7 @@
#include "item_use.h"
#include "itemprop.h"
#include "libutil.h"
+#include "macro.h"
#include "message.h"
#include "mon-util.h"
#include "newgame.h"
@@ -1697,6 +1698,74 @@ void game_options::set_option_fragment(const std::string &s)
}
}
+// 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;
+ }
+
+ bind_command_to_key(cmd, key);
+}
+
void game_options::read_option_line(const std::string &str, bool runscript)
{
#define BOOL_OPTION_NAMED(_opt_str, _opt_var) \
@@ -1823,7 +1892,7 @@ void game_options::read_option_line(const std::string &str, bool runscript)
&& key != "menu_colour" && key != "menu_color"
&& key != "message_colour" && key != "message_color"
&& key != "levels" && key != "level" && key != "entries"
- && key != "include")
+ && key != "include" && key != "bindkey")
{
lowercase( field );
}
@@ -2879,6 +2948,11 @@ void game_options::read_option_line(const std::string &str, bool runscript)
else BOOL_OPTION(use_dos_char);
#endif
+ else if(key == "bindkey")
+ {
+ _bindkey(field);
+ }
+
// Catch-all else, copies option into map
else if (runscript)
{
diff --git a/crawl-ref/source/macro.cc b/crawl-ref/source/macro.cc
index 7f9526ea7e..595c3f0647 100644
--- a/crawl-ref/source/macro.cc
+++ b/crawl-ref/source/macro.cc
@@ -67,6 +67,11 @@ static macromap *all_maps[] =
&Keymaps[KC_LEVELMAP],
&Keymaps[KC_TARGETING],
&Keymaps[KC_CONFIRM],
+
+#ifdef USE_TILE
+ &Keymaps[KC_TILE],
+#endif
+
&Macros,
};
@@ -77,6 +82,38 @@ static std::vector<std::string> userfunctions;
static std::vector<key_recorder*> recorders;
+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];
+
inline int userfunc_index(int key)
{
int index = (key <= USERFUNCBASE? USERFUNCBASE - key : -1);
@@ -990,3 +1027,161 @@ int get_macro_buf_size()
{
return (Buffer.size());
}
+
+///////////////////////////////////////////////////////////////
+// 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;
+}
diff --git a/crawl-ref/source/macro.h b/crawl-ref/source/macro.h
index 35b2514a51..16c13f358c 100644
--- a/crawl-ref/source/macro.h
+++ b/crawl-ref/source/macro.h
@@ -29,6 +29,10 @@ enum KeymapContext {
KC_TARGETING, // Only during 'x' and other targeting modes
KC_CONFIRM, // When being asked y/n/q questions
+#ifdef USE_TILE
+ KC_TILE, // For context_for_command()
+#endif
+
KC_CONTEXT_COUNT, // Must always be the last real context
KC_NONE // Don't apply any keymaps (for menus)
};
@@ -85,4 +89,17 @@ void insert_macro_into_buff(const keyseq& keys);
int get_macro_buf_size();
+///////////////////////////////////////////////////////////////
+// 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);
#endif
diff --git a/crawl-ref/source/util/cmd-name.pl b/crawl-ref/source/util/cmd-name.pl
new file mode 100755
index 0000000000..6a452575ff
--- /dev/null
+++ b/crawl-ref/source/util/cmd-name.pl
@@ -0,0 +1,76 @@
+#!/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);