summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-07-26 01:19:42 +0000
committerzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-07-26 01:19:42 +0000
commitfcdae070af8fe650f7e9df51a88f622b2973a11f (patch)
tree527653de843119485bb7735b39fdd844ff7071c2
parent6a38874fed2ede86cac0ca906c2fa90370432280 (diff)
downloadcrawl-ref-fcdae070af8fe650f7e9df51a88f622b2973a11f.tar.gz
crawl-ref-fcdae070af8fe650f7e9df51a88f622b2973a11f.zip
Merge r6587, keybindings. Fixes bug 2018200: macros not working with the
old 0.3.4 keymap. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/branches/stone_soup-0.4@6682 c06c8d41-db1a-0410-9941-cceddc491573
-rw-r--r--crawl-ref/docs/034_changes.txt2
-rw-r--r--crawl-ref/docs/options_guide.txt8
-rw-r--r--crawl-ref/settings/034_command_keys.txt68
-rw-r--r--crawl-ref/settings/init.txt2
-rw-r--r--crawl-ref/source/acr.cc137
-rw-r--r--crawl-ref/source/cmd-keys.h170
-rw-r--r--crawl-ref/source/cmd-name.h198
-rw-r--r--crawl-ref/source/directn.cc76
-rw-r--r--crawl-ref/source/enum.h26
-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
13 files changed, 788 insertions, 263 deletions
diff --git a/crawl-ref/docs/034_changes.txt b/crawl-ref/docs/034_changes.txt
index 0ceb44845c..6ed359420d 100644
--- a/crawl-ref/docs/034_changes.txt
+++ b/crawl-ref/docs/034_changes.txt
@@ -68,7 +68,7 @@ We are content that all of these changes are genuine improvements. Should
your brain be hardwired to the old settings, you can effectively enforce
the 0.3.4 state by using the following options:
include = 034_monster_glyphs.txt
- additional_macro_file = 034_command_keys.txt
+ include = 034_command_keys.txt
always_confirm_butcher = true
Note that the header of init.txt contains these lines. (It contains some
diff --git a/crawl-ref/docs/options_guide.txt b/crawl-ref/docs/options_guide.txt
index f182fed5ec..e7cb00a362 100644
--- a/crawl-ref/docs/options_guide.txt
+++ b/crawl-ref/docs/options_guide.txt
@@ -82,7 +82,7 @@ The contents of this text are:
autoinscribe
4-n Macro related Options.
flush.failure, flush.command, flush.message,
- macro_meta_entry, additional_macro_file
+ macro_meta_entry, additional_macro_file, bindkey
4-o Tiles Options.
tile_show_items, title_screen, tile_player_col,
tile_monster_col, tile_neutral_col, tile_friendly_col,
@@ -1470,6 +1470,12 @@ additional_macro_file = path/to/filename
Add an additional macro file to be loaded after macro.txt.
You can have multiple additional_macro_file lines.
+bindkey = [^D] CMD_BUTCHER
+ Change which key invokes which command at a lower level of
+ operation than macros. Useful in that macros cannot (yet)
+ invoke each other, but a macro can invoke a command whose
+ key has changed.
+
4-o Tiles Options.
----------------------
In non-tile games the tile options are ignored.
diff --git a/crawl-ref/settings/034_command_keys.txt b/crawl-ref/settings/034_command_keys.txt
index 5cbc347da3..955bcf3d06 100644
--- a/crawl-ref/settings/034_command_keys.txt
+++ b/crawl-ref/settings/034_command_keys.txt
@@ -1,56 +1,22 @@
-# This file contains macros for using 0.3.4 command keys instead of the
+# This file keybinds for using 0.3.4 command keys instead of the
# new set from 0.4.
# If you want to use it, add the following line to your init.txt:
-# : crawl.read_options('docs/034_command_keys.txt')
+# include = 034_keybindings.txt
# Note that the 'v'iew item command is not available anymore. You can
-# 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
-
-# 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
+# get the same functionality by pressing the item slot while looking at
+# you inventory.
+
+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_THROW_ITEM_NO_QUIVER
diff --git a/crawl-ref/settings/init.txt b/crawl-ref/settings/init.txt
index 3b9e37c593..cf1924e631 100644
--- a/crawl-ref/settings/init.txt
+++ b/crawl-ref/settings/init.txt
@@ -10,7 +10,7 @@
# (New players should just ignore these lines.)
#
# include = 034_monster_glyphs.txt
-# additional_macro_file = 034_command_keys.txt
+# inlcude = 034_command_keys.txt
# classic_item_colours = true
# classic_hud = true
# use_old_selection_order = true
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 4f312b8e0f..0f53e43075 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -153,8 +153,6 @@ player you;
system_environment SysEnv;
game_state crawl_state;
-
-
std::string init_file_error; // externed in newgame.cc
char info[ INFO_SIZE ]; // messaging queue extern'd everywhere {dlb}
@@ -212,6 +210,9 @@ int old_main( int argc, char *argv[] )
int main( int argc, char *argv[] )
#endif
{
+ // Hardcoded initial keybindings.
+ init_keybindings();
+
_compile_time_asserts(); // Just to quiet "unused static function" warning.
// Load in the system environment variables
@@ -3412,141 +3413,17 @@ 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_DONE: return CMD_NEXT_CMD;
- case CK_MOUSE_B1ITEM: return CMD_USE_ITEM;
- case CK_MOUSE_B2ITEM: return CMD_VIEW_ITEM;
-#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;
-#ifdef USE_TILE
- case CONTROL('V'): return CMD_EDIT_PREFS;
-#else
- case CONTROL('V'): return CMD_NO_CMD;
-#endif
- 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..dee35bff54
--- /dev/null
+++ b/crawl-ref/source/cmd-keys.h
@@ -0,0 +1,170 @@
+#ifdef USE_TILE
+{'-', CMD_EDIT_PLAYER_TILE},
+{CK_MOUSE_DONE, CMD_NEXT_CMD},
+{CK_MOUSE_B1ITEM, CMD_USE_ITEM},
+{CK_MOUSE_B2ITEM, CMD_VIEW_ITEM},
+{CONTROL('V'), CMD_EDIT_PREFS},
+#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..404d676f3f
--- /dev/null
+++ b/crawl-ref/source/cmd-name.h
@@ -0,0 +1,198 @@
+// 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_PREFS, "CMD_EDIT_PREFS"},
+{CMD_EDIT_PLAYER_TILE, "CMD_EDIT_PLAYER_TILE"},
+{CMD_USE_ITEM, "CMD_USE_ITEM"},
+{CMD_VIEW_ITEM, "CMD_VIEW_ITEM"},
+#endif
+
+{CMD_NO_CMD, NULL}
diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc
index 5805cabf9c..9652a978ea 100644
--- a/crawl-ref/source/directn.cc
+++ b/crawl-ref/source/directn.cc
@@ -2709,78 +2709,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 eb850c9320..12495f8a47 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,32 +621,32 @@ 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_PREFS,
CMD_EDIT_PLAYER_TILE,
CMD_USE_ITEM,
CMD_VIEW_ITEM,
+ CMD_MAX_TILE = CMD_VIEW_ITEM,
#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,
+
+ CMD_MAX_CMD
};
enum conduct_type
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index 5d8ae48751..98db34eaeb 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"
@@ -1704,6 +1705,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) \
@@ -1830,7 +1899,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 );
}
@@ -2881,6 +2950,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 712cd8c39d..c983f203d4 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);
@@ -992,3 +1029,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);