From 8da769b0c2f68d39bb38d4cc4a24bb1817be0e2b Mon Sep 17 00:00:00 2001 From: Lucas GAUTHERON Date: Tue, 30 Aug 2011 18:17:38 +0000 Subject: [PATCH] hardcoded bind/specbind/editbind (win client included to keep it compatible with resetbinds.cfg) git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@6622 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- config/resetbinds.cfg | 57 ++++++++++++++++++++++++++-------------- source/src/console.cpp | 59 ++++++++++++++++++++++++++++-------------- source/src/protos.h | 21 ++++++++++----- 3 files changed, 92 insertions(+), 45 deletions(-) diff --git a/config/resetbinds.cfg b/config/resetbinds.cfg index 2f88fcac..6fb87da3 100644 --- a/config/resetbinds.cfg +++ b/config/resetbinds.cfg @@ -4,11 +4,13 @@ // Do not modify. bind MOUSE1 "attack" -bind MOUSE2 [ if $editing [ showmenu editing ] [ altaction ] ] +bind MOUSE2 "altaction" +editbind MOUSE2 [ showmenu editing ] bind MOUSE3 [ weapon ] bind MOUSE4 "universaldelta 1" bind MOUSE5 "universaldelta -1" -bind BACKSPACE [ if $editing [ delent ] [ dropflag ] ] +bind BACKSPACE "dropflag" +editbind BACKSPACE "delent" bind TAB [ showscores 1; onrelease [ showscores 0 ] ] bind CLEAR "" bind RETURN "" @@ -31,19 +33,26 @@ bind MINUS [ if $editing [ copyent ] ] bind PERIOD [ if $old_editbinds [ equalize 2 ] ] bind SLASH "saycommand /" bind 0 "" -bind 1 [ if $editing [ domodifier 5 ] [ primary ] ] -bind 2 [ if $editing [ domodifier 7 ] [ secondary ] ] -bind 3 [ if $editing [ domodifier 8 ] [ grenades ] ] -bind 4 [ if $editing [ domodifier 9 ] [ melee ] ] +bind 1 "primary" +editbind 1 [ domodifier 5 ] +bind 2 "secondary" +editbind 2 [ domodifier 7 ] +bind 3 "grenades" +editbind 3 [ domodifier 8 ] +bind 4 "melee" +editbind 4 [ domodifier 9 ] bind 5 "" bind 6 "" -bind 7 [ if $editing [ nextclosestent ] ] +bind 7 "" +editbind 7 "nextclosestent" bind 8 "vdelta -1" bind 9 "vdelta 1" bind COLON "" -bind SEMICOLON [ if $editing [ editent ] ] +bind SEMICOLON "" +editbind SEMICOLON "editent" bind LESS "" -bind EQUALS [ if $editing [ pasteent ] ] +bind EQUALS "" +editbind EQUALS "pasteent" bind GREATER "" bind QUESTION "" bind AT "" @@ -59,27 +68,34 @@ bind C "copy" bind D "right" bind E "edittoggle" bind F [ if $old_editbinds [ solid 1 ] [ if $editing [ if (countwalls 0) [ solid 0 ] [ solid 1 ] ] ] ] // Toggle solid/non-solid -bind G [ if $editing [ solid 0 ] [ quicknadethrow ] ] +bind G "quicknadethrow" +editbind G [ solid 0 ] // Directional heightfielding - look up for toggle CHF/non-solid, look down for toggle FHF/non-solid bind H [ if $old_editbinds [ heightfield 0 ] [ if $editing [ if (= $flrceil 0) [ if (countwalls 2) [ solid 0 ] [ heightfield 0 ] ] [ if (= $flrceil 2) [ if (countwalls 3) [ solid 0 ] [ heightfield 2 ] ] ] ] ] ] bind I [ if $old_editbinds [ heightfield 2 ] ] bind J "" bind K [ if $old_editbinds [ corner ] [ if $editing [ if (countwalls 1) [ solid 0 ] [ corner ] ] ] ] // Toggle corner/non-solid -bind L [ if $editing [ showmenu Lighting ] ] -bind M [ if $editing [ domodifier 6 ] ] +bind L "" +editbind L [ showmenu Lightning ] +bind M "" +editbind M [ domodifier 6 ] bind N [ quickanswer ] bind O "editheight 2 -1" bind P "editheight 2 1" -bind Q [ if $editing [ domodifier 1 ] ] +bind Q "" +editbind Q [ domodifier 1 ] bind R "reload" bind S "backward" bind T "saycommand" // or even "saycommand >" bind U "undo" -bind V [ if $editing [ paste ] [ showmenu voicecom ] ] +bind V [ showmenu voicecom ] +editbind V "paste" bind W "forward" -bind X [ if $editing [ domodifier 3 ] ] +bind X "" +editbind X [ domodifier 3 ] bind Y "saycommand %" -bind Z [ if $editing [ domodifier 2 ] ] +bind Z "" +editbind Z [ domodifier 2 ] bind DELETE "edittex 0 -1" bind KP0 "weapon 4 1" bind KP1 "" @@ -111,9 +127,12 @@ bind F1 [ if $votepending [ && (vote 1) (echo you voted yes) ] ] bind F2 [ if $votepending [ && (vote 2) (echo you voted no) ] ] bind F3 "" bind F4 "" -bind F5 [ if $editing [ toggleocull ] [ domodifier 1 ] ] -bind F6 [ if $editing [ showmip ] [ domodifier 2 ] ] -bind F7 [ if $editing [ if $fullbright [ fullbright 0 ] [ fullbright 1 ] ] ] +bind F5 [ domodifier 1 ] +editbind F5 "toggleocull" +bind F6 [ domodifier 2 ] +editbind F6 "showmip" +bind F7 "" +editbind F7 [ if $fullbright [ fullbright 0 ] [ fullbright 1 ] ] bind F8 "" bind F9 "" bind F10 "getdemo" diff --git a/source/src/console.cpp b/source/src/console.cpp index 4ca080a8..6823c2da 100644 --- a/source/src/console.cpp +++ b/source/src/console.cpp @@ -177,12 +177,15 @@ int rendercommand_wip(int x, int y, int w) vector keyms; +const char *keycmds[keym::NUMACTIONS] = { "bind", "specbind", "editbind" }; +inline const char *keycmd(int type) { return type >= 0 && type < keym::NUMACTIONS ? keycmds[type] : ""; } + void keymap(char *code, char *key, char *action) { keym &km = keyms.add(); km.code = atoi(code); km.name = newstring(key); - km.action = newstring(action); +// km.action = newstring(action); } COMMAND(keymap, ARG_3STR); @@ -193,9 +196,9 @@ keym *findbind(const char *key) return NULL; } -keym *findbinda(const char *action) +keym *findbinda(const char *action, int type) { - loopv(keyms) if(!strcasecmp(keyms[i].action, action)) return &keyms[i]; + loopv(keyms) if(!strcasecmp(keyms[i].actions[type], action)) return &keyms[i]; return NULL; } @@ -208,42 +211,45 @@ keym *findbindc(int code) keym *keypressed = NULL; char *keyaction = NULL; -bool bindkey(keym *km, const char *action) +bool bindkey(keym *km, const char *action, int type) { if(!km) return false; - if(!keypressed || keyaction!=km->action) delete[] km->action; - km->action = newstring(action); + if(type < keym::ACTION_DEFAULT || type >= keym::NUMACTIONS) { conoutf("invalid bind type \"%i\"", type); return false; } + if(!keypressed || keyaction!=km->actions[type]) delete[] km->actions[type]; + km->actions[type] = newstring(action); return true; } -void bindk(const char *key, const char *action) +void bindk(const char *key, const char *action, int type) { keym *km = findbind(key); if(!km) { conoutf("unknown key \"%s\"", key); return; } - bindkey(km, action); + bindkey(km, action, type); } -void keybind(const char *key) +void keybind(const char *key, int type) { keym *km = findbind(key); if(!km) { conoutf("unknown key \"%s\"", key); return; } - result(km->action); + if(type < keym::ACTION_DEFAULT || type >= keym::NUMACTIONS) { conoutf("invalid bind type \"%i\"", type); return; } + result(km->actions[type]); } -bool bindc(int code, const char *action) +bool bindc(int code, const char *action, int type) { keym *km = findbindc(code); - if(km) return bindkey(km, action); + if(km) return bindkey(km, action, type); else return false; } -void searchbinds(const char *action) +void searchbinds(const char *action, int type) { if(!action || !action[0]) return; + if(type < keym::ACTION_DEFAULT || type >= keym::NUMACTIONS) { conoutf("invalid bind type \"%i\"", type); return; } vector names; loopv(keyms) { - if(strstr(keyms[i].action, action)) + if(!strcmp(keyms[i].actions[type], action)) { if(names.length()) names.add(' '); names.put(keyms[i].name, strlen(keyms[i].name)); @@ -253,9 +259,17 @@ void searchbinds(const char *action) result(names.getbuf()); } -COMMAND(keybind, ARG_1STR); -COMMANDN(bind, bindk, ARG_2STR); -COMMAND(searchbinds, ARG_1STR); +COMMANDF(keybind, ARG_1STR, (const char *key) { keybind(key, keym::ACTION_DEFAULT); } ); +COMMANDF(keyspecbind, ARG_1STR, (const char *key) { keybind(key, keym::ACTION_SPECTATOR); } ); +COMMANDF(keyeditbind, ARG_1STR, (const char *key) { keybind(key, keym::ACTION_EDITING); } ); + +COMMANDF(bind, ARG_2STR, (const char *key, const char *action) { bindk(key, action, keym::ACTION_DEFAULT); } ); +COMMANDF(specbind, ARG_2STR, (const char *key, const char *action) { bindk(key, action, keym::ACTION_SPECTATOR); } ); +COMMANDF(editbind, ARG_2STR, (const char *key, const char *action) { bindk(key, action, keym::ACTION_EDITING); } ); + +COMMANDF(searchbinds, ARG_1STR, (const char *action) { searchbinds(action, keym::ACTION_DEFAULT); }); +COMMANDF(searchspecbinds, ARG_1STR, (const char *action) { searchbinds(action, keym::ACTION_SPECTATOR); }); +COMMANDF(searcheditbinds, ARG_1STR, (const char *action) { searchbinds(action, keym::ACTION_EDITING); }); struct releaseaction { @@ -444,11 +458,15 @@ void execbind(keym &k, bool isdown) } if(isdown) { - keyaction = k.action; + int state = keym::ACTION_DEFAULT; + if(editmode) state = keym::ACTION_EDITING; + else if(player1->isspectating()) state = keym::ACTION_SPECTATOR; + char *&action = k.actions[state][0] ? k.actions[state] : k.actions[keym::ACTION_DEFAULT]; + keyaction = action; keypressed = &k; execute(keyaction); keypressed = NULL; - if(keyaction!=k.action) delete[] keyaction; + if(keyaction!=action) delete[] keyaction; } k.pressed = isdown; } @@ -545,7 +563,8 @@ void writebinds(stream *f) { loopv(keyms) { - if(*keyms[i].action) f->printf("bind %s [%s]\n", keyms[i].name, keyms[i].action); + keym *km = &keyms[i]; + loopj(3) if(km->actions[j]) f->printf("%s \"%s\" [%s]\n", keycmd(j), km->name, km->actions[j]); } } diff --git a/source/src/protos.h b/source/src/protos.h index 20e645d7..9ad3a945 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -64,18 +64,27 @@ extern void clientlogf(const char *s, ...); struct keym { int code; - char *name, *action; + + enum + { + ACTION_DEFAULT = 0, + ACTION_SPECTATOR, + ACTION_EDITING, + NUMACTIONS + }; + + char *name, *actions[NUMACTIONS]; bool pressed; - keym() : code(-1), name(NULL), action(NULL), pressed(false) {} - ~keym() { DELETEA(name); DELETEA(action); } + keym() : code(-1), name(NULL), pressed(false) { loopi(NUMACTIONS) actions[i] = newstring(""); } + ~keym() { DELETEA(name); loopi(NUMACTIONS) DELETEA(actions[i]); } }; extern keym *keypressed; -extern bool bindkey(keym *km, const char *action); -extern keym *findbinda(const char *action); -extern bool bindc(int code, const char *action); +extern bool bindkey(keym *km, const char *action, int state = keym::ACTION_DEFAULT); +extern keym *findbinda(const char *action, int type = keym::ACTION_DEFAULT); +extern bool bindc(int code, const char *action, int type = keym::ACTION_DEFAULT); // menus extern void rendermenu();