diff options
Diffstat (limited to 'crawl-ref/source')
-rw-r--r-- | crawl-ref/source/acr.cc | 125 | ||||
-rw-r--r-- | crawl-ref/source/cmd-keys.h | 166 | ||||
-rw-r--r-- | crawl-ref/source/cmd-name.h | 195 | ||||
-rw-r--r-- | crawl-ref/source/directn.cc | 76 | ||||
-rw-r--r-- | crawl-ref/source/enum.h | 27 | ||||
-rw-r--r-- | crawl-ref/source/initfile.cc | 76 | ||||
-rw-r--r-- | crawl-ref/source/macro.cc | 195 | ||||
-rw-r--r-- | crawl-ref/source/macro.h | 17 | ||||
-rwxr-xr-x | crawl-ref/source/util/cmd-name.pl | 76 |
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); |