diff options
Diffstat (limited to 'src/game/client/components/binds.cpp')
| -rw-r--r-- | src/game/client/components/binds.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/game/client/components/binds.cpp b/src/game/client/components/binds.cpp new file mode 100644 index 00000000..5d033ad4 --- /dev/null +++ b/src/game/client/components/binds.cpp @@ -0,0 +1,181 @@ +extern "C" { + #include <engine/e_console.h> +} + +#include "binds.hpp" + +BINDS::BINDS() +{ + mem_zero(keybindings, sizeof(keybindings)); +} + +void BINDS::bind(int keyid, const char *str) +{ + if(keyid < 0 && keyid >= KEY_LAST) + return; + + str_copy(keybindings[keyid], str, sizeof(keybindings[keyid])); + if(!keybindings[keyid][0]) + dbg_msg("binds", "unbound %s (%d)", inp_key_name(keyid), keyid); + else + dbg_msg("binds", "bound %s (%d) = %s", inp_key_name(keyid), keyid, keybindings[keyid]); +} + + +bool BINDS::on_input(INPUT_EVENT e) +{ + // don't handle invalid events and keys that arn't set to anything + if(e.key <= 0 || e.key >= KEY_LAST || keybindings[e.key][0] == 0) + return false; + + int stroke = 0; + if(e.flags&INPFLAG_PRESS) + stroke = 1; + console_execute_line_stroked(stroke, keybindings[e.key]); + return true; +} + +void BINDS::unbindall() +{ + for(int i = 0; i < KEY_LAST; i++) + keybindings[i][0] = 0; +} + +const char *BINDS::get(int keyid) +{ + if(keyid > 0 && keyid < KEY_LAST) + return keybindings[keyid]; + return ""; +} + +void BINDS::set_defaults() +{ + unbindall(); + + // set default key bindings + bind(KEY_F1, "toggle_local_console"); + bind(KEY_F2, "toggle_remote_console"); + bind(KEY_TAB, "+scoreboard"); + bind(KEY_F10, "screenshot"); + + bind('A', "+left"); + bind('D', "+right"); + bind(KEY_SPACE, "+jump"); + bind(KEY_MOUSE_1, "+fire"); + bind(KEY_MOUSE_2, "+hook"); + bind(KEY_LSHIFT, "+emote"); + + bind('1', "+weapon1"); + bind('2', "+weapon2"); + bind('3', "+weapon3"); + bind('4', "+weapon4"); + bind('5', "+weapon5"); + + bind(KEY_MOUSE_WHEEL_UP, "+prevweapon"); + bind(KEY_MOUSE_WHEEL_DOWN, "+nextweapon"); + + bind('T', "chat all"); + bind('Y', "chat team"); +} + +void BINDS::on_init() +{ + set_defaults(); +} + +/* +static int get_key_id(const char *key_name) +{ + // check for numeric + if(key_name[0] == '#') + { + int i = atoi(key_name+1); + if(i > 0 && i < KEY_LAST) + return i; // numeric + } + + // search for key + for(int i = 0; i < KEY_LAST; i++) + { + if(strcmp(key_name, inp_key_name(i)) == 0) + return i; + } + + return 0; +} + +static void con_bind(void *result, void *user_data) +{ + const char *key_name = console_arg_string(result, 0); + int id = get_key_id(key_name); + + if(!id) + { + dbg_msg("binds", "key %s not found", key_name); + return; + } + + binds_set(id, console_arg_string(result, 1)); +} + + +static void con_unbind(void *result, void *user_data) +{ + const char *key_name = console_arg_string(result, 0); + int id = get_key_id(key_name); + + if(!id) + { + dbg_msg("binds", "key %s not found", key_name); + return; + } + + binds_set(id, ""); +} + + +static void con_unbindall(void *result, void *user_data) +{ + binds_unbindall(); +} + + +static void con_dump_binds(void *result, void *user_data) +{ + for(int i = 0; i < KEY_LAST; i++) + { + if(keybindings[i][0] == 0) + continue; + dbg_msg("binds", "%s (%d) = %s", inp_key_name(i), i, keybindings[i]); + } +} + +void binds_save() +{ + char buffer[256]; + char *end = buffer+sizeof(buffer)-8; + client_save_line("unbindall"); + for(int i = 0; i < KEY_LAST; i++) + { + if(keybindings[i][0] == 0) + continue; + str_format(buffer, sizeof(buffer), "bind %s ", inp_key_name(i)); + + // process the string. we need to escape some characters + const char *src = keybindings[i]; + char *dst = buffer + strlen(buffer); + *dst++ = '"'; + while(*src && dst < end) + { + if(*src == '"' || *src == '\\') // escape \ and " + *dst++ = '\\'; + *dst++ = *src++; + } + *dst++ = '"'; + *dst++ = 0; + + client_save_line(buffer); + } +} + +*/ |