From cd8862f0bc964dd30d9341495ae10e9a929d7df6 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 26 Nov 2021 14:56:25 -0500 Subject: [PATCH] New input handling Events have a player ID instead of adding billions of keys for separate gamepads. Axis movement (mouse movement, analog sticks) now are counted as keys, so axes don't need to be separately implemented for all controls. Game controls emulate a Saturn controller (some of the external functions like screenshot / gif should be readded, but I got lazy) This will allow later us to save a config for a controller that can be reused for any player slot, which is one of the main goals for profiles. Only just enough was made to use the new input system to make it compile. Menus in this branch should aim to move to using PlayerInputDown entirely, instead of using hardcoded keys & simply remapping to those --- src/am_map.c | 2 +- src/command.c | 57 +-- src/d_clisrv.c | 8 +- src/d_event.h | 4 +- src/d_main.c | 9 - src/d_netcmd.c | 12 - src/doomstat.h | 1 - src/f_finale.c | 9 +- src/g_game.c | 412 +++++++-------------- src/g_game.h | 31 +- src/g_input.c | 885 ++++++++++++-------------------------------- src/g_input.h | 116 ++---- src/hu_stuff.c | 12 +- src/k_menufunc.c | 17 +- src/m_misc.c | 18 +- src/p_tick.c | 2 +- src/p_user.c | 8 +- src/sdl/i_system.c | 2 +- src/sdl/i_video.c | 200 ++++------ src/win32/win_sys.c | 5 +- src/y_inter.c | 10 +- 21 files changed, 550 insertions(+), 1270 deletions(-) diff --git a/src/am_map.c b/src/am_map.c index 53a7480a5..04806de94 100644 --- a/src/am_map.c +++ b/src/am_map.c @@ -462,7 +462,7 @@ boolean AM_Responder(event_t *ev) { //faB: prevent alt-tab in win32 version to activate automap just before // minimizing the app; doesn't do any harm to the DOS version - if (!gamekeydown[KEY_LALT] && !gamekeydown[KEY_RALT]) + if (!gamekeydown[0][KEY_LALT] && !gamekeydown[0][KEY_RALT]) { bigstate = 0; //added : 24-01-98 : toggle off large view AM_Start(); diff --git a/src/command.c b/src/command.c index 6e551d24c..728aad1ba 100644 --- a/src/command.c +++ b/src/command.c @@ -2161,58 +2161,10 @@ static void CV_EnforceExecVersion(void) CV_StealthSetValue(&cv_execversion, EXECVERSION); } -static boolean CV_FilterJoyAxisVars(consvar_t *v, const char *valstr) -{ -#if 1 - // We don't have changed axis defaults yet - (void)v; - (void)valstr; -#else - UINT8 i; - - // If ALL axis settings are previous defaults, set them to the new defaults - // EXECVERSION < 26 (2.1.21) - - for (i = 0; i < 4; i++) - { - if (joyaxis_default[i]) - { - if (!stricmp(v->name, "joyaxis_fire")) - { - if (joyaxis_count[i] > 7) return false; - else if (joyaxis_count[i] == 7) return true; - - if (!stricmp(valstr, "None")) joyaxis_count[i]++; - else joyaxis_default[i] = false; - } - // reset all axis settings to defaults - if (joyaxis_count[i] == 7) - { - switch (i) - { - default: - COM_BufInsertText(va("%s \"%s\"\n", cv_turnaxis[0].name, cv_turnaxis[0].defaultvalue)); - COM_BufInsertText(va("%s \"%s\"\n", cv_moveaxis[0].name, cv_moveaxis[0].defaultvalue)); - COM_BufInsertText(va("%s \"%s\"\n", cv_brakeaxis[0].name, cv_brakeaxis[0].defaultvalue)); - COM_BufInsertText(va("%s \"%s\"\n", cv_aimaxis[0].name, cv_aimaxis[0].defaultvalue)); - COM_BufInsertText(va("%s \"%s\"\n", cv_lookaxis[0].name, cv_lookaxis[0].defaultvalue)); - COM_BufInsertText(va("%s \"%s\"\n", cv_fireaxis[0].name, cv_fireaxis[0].defaultvalue)); - COM_BufInsertText(va("%s \"%s\"\n", cv_driftaxis[0].name, cv_driftaxis[0].defaultvalue)); - break; - } - joyaxis_count[i]++; - return false; - } - } - } -#endif - - // we haven't reached our counts yet, or we're not default - return true; -} - static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr) { + (void)valstr; + // True means allow the CV change, False means block it // We only care about CV_SAVE because this filters the user's config files @@ -2230,11 +2182,6 @@ static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr) || !stricmp(v->name, "mousemove2")) return false; #endif - - // axis defaults were changed to be friendly to 360 controllers - // if ALL axis settings are defaults, then change them to new values - if (!CV_FilterJoyAxisVars(v, valstr)) - return false; } return true; diff --git a/src/d_clisrv.c b/src/d_clisrv.c index a9576bdcf..e39ef5227 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1494,7 +1494,7 @@ static void M_ConfirmConnect(event_t *ev) #ifndef NONET if (ev->type == ev_keydown) { - if (ev->data1 == ' ' || ev->data1 == 'y' || ev->data1 == KEY_ENTER || ev->data1 == gamecontrol[0][gc_accelerate][0] || ev->data1 == gamecontrol[0][gc_accelerate][1]) + if (ev->data1 == ' ' || ev->data1 == 'y' || ev->data1 == KEY_ENTER || ev->data1 == gamecontrol[0][gc_a][0] || ev->data1 == gamecontrol[0][gc_a][1]) { if (totalfilesrequestednum > 0) { @@ -1517,7 +1517,7 @@ static void M_ConfirmConnect(event_t *ev) M_ClearMenus(true); } - else if (ev->data1 == 'n' || ev->data1 == KEY_ESCAPE|| ev->data1 == gamecontrol[0][gc_brake][0] || ev->data1 == gamecontrol[0][gc_brake][1]) + else if (ev->data1 == 'n' || ev->data1 == KEY_ESCAPE|| ev->data1 == gamecontrol[0][gc_b][0] || ev->data1 == gamecontrol[0][gc_b][1]) { cl_mode = CL_ABORTED; M_ClearMenus(true); @@ -1923,7 +1923,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic if (cl_mode == CL_CONFIRMCONNECT) D_ProcessEvents(); //needed for menu system to receive inputs - if ((gamekeydown[KEY_ESCAPE] || gamekeydown[KEY_JOY1+1]) || cl_mode == CL_ABORTED) + if ((gamekeydown[0][KEY_ESCAPE] || gamekeydown[0][KEY_JOY1+1]) || cl_mode == CL_ABORTED) { CONS_Printf(M_GetText("Network game synchronization aborted.\n")); // M_StartMessage(M_GetText("Network game synchronization aborted.\n\nPress ESC\n"), NULL, MM_NOTHING); @@ -1931,7 +1931,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic D_QuitNetGame(); CL_Reset(); D_StartTitle(); - memset(gamekeydown, 0, NUMKEYS); + memset(gamekeydown, 0, sizeof (gamekeydown)); return false; } diff --git a/src/d_event.h b/src/d_event.h index c69796573..5a8c915a3 100644 --- a/src/d_event.h +++ b/src/d_event.h @@ -25,9 +25,6 @@ typedef enum ev_console, ev_mouse, ev_joystick, - ev_joystick2, - ev_joystick3, - ev_joystick4, } evtype_t; // Event structure. @@ -37,6 +34,7 @@ typedef struct INT32 data1; // keys / mouse/joystick buttons INT32 data2; // mouse/joystick x move INT32 data3; // mouse/joystick y move + INT32 device; // which player's device it belongs to } event_t; // diff --git a/src/d_main.c b/src/d_main.c index 3a2259337..d71903d2e 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -908,15 +908,6 @@ void D_StartTitle(void) V_SetPaletteLump("PLAYPAL"); // The title screen is obviously not a tutorial! (Unless I'm mistaken) - /* - if (tutorialmode && tutorialgcs) - { - G_CopyControls(gamecontrol[0], gamecontroldefault[0][gcs_custom], gcl_full, num_gcl_full); // using gcs_custom as temp storage - M_StartMessage("Do you want to \x82save the recommended \x82movement controls?\x80\n\nPress 'Y' or 'Enter' to confirm\nPress 'N' or any key to keep \nyour current controls", - M_TutorialSaveControlResponse, MM_YESNO); - } - */ - tutorialmode = false; } diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 10e580d09..b5c3837df 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -925,15 +925,7 @@ void D_RegisterClientCommands(void) for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { CV_RegisterVar(&cv_kickstartaccel[i]); - CV_RegisterVar(&cv_turnaxis[i]); - CV_RegisterVar(&cv_moveaxis[i]); - CV_RegisterVar(&cv_brakeaxis[i]); - CV_RegisterVar(&cv_aimaxis[i]); - CV_RegisterVar(&cv_lookaxis[i]); - CV_RegisterVar(&cv_fireaxis[i]); - CV_RegisterVar(&cv_driftaxis[i]); CV_RegisterVar(&cv_deadzone[i]); - CV_RegisterVar(&cv_digitaldeadzone[i]); } // filesrch.c @@ -2766,10 +2758,6 @@ static void Command_Map_f(void) return; } - if (tutorialmode && tutorialgcs) - { - G_CopyControls(gamecontrol[0], gamecontroldefault[0][gcs_custom], gcl_full, num_gcl_full); // using gcs_custom as temp storage - } tutorialmode = false; // warping takes us out of tutorial mode D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, fromlevelselect); diff --git a/src/doomstat.h b/src/doomstat.h index 19359df3b..a4aba708b 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -183,7 +183,6 @@ extern INT16 bootmap; //bootmap for loading a map on startup extern INT16 tutorialmap; // map to load for tutorial extern boolean tutorialmode; // are we in a tutorial right now? -extern INT32 tutorialgcs; // which control scheme is loaded? extern boolean looptitle; diff --git a/src/f_finale.c b/src/f_finale.c index c43e17a28..d5450f2c7 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2684,12 +2684,13 @@ void F_StartTextPrompt(INT32 promptnum, INT32 pagenum, mobj_t *mo, UINT16 postex static boolean F_GetTextPromptTutorialTag(char *tag, INT32 length) { - INT32 gcs = gcs_custom; + INT32 gcs = 0; boolean suffixed = true; if (!tag || !tag[0] || !tutorialmode) return false; + /* if (!strncmp(tag, "TAA", 3)) // Accelerate gcs = G_GetControlScheme(gamecontrol[0], gcl_accelerate, num_gcl_accelerate); else if (!strncmp(tag, "TAB", 3)) // Brake @@ -2704,14 +2705,10 @@ static boolean F_GetTextPromptTutorialTag(char *tag, INT32 length) gcs = G_GetControlScheme(gamecontrol[0], gcl_item, num_gcl_item); else gcs = G_GetControlScheme(gamecontrol[0], gcl_full, num_gcl_full); + */ switch (gcs) { - case gcs_kart: - // strncat(tag, "KART", length); - suffixed = false; - break; - default: strncat(tag, "CUSTOM", length); break; diff --git a/src/g_game.c b/src/g_game.c index 20f9b3b8e..fd42a4849 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -155,7 +155,6 @@ INT16 bootmap; //bootmap for loading a map on startup INT16 tutorialmap = 0; // map to load for tutorial boolean tutorialmode = false; // are we in a tutorial right now? -INT32 tutorialgcs = gcs_custom; // which control scheme is loaded? boolean looptitle = true; @@ -347,22 +346,6 @@ static void kickstartaccel3_OnChange(void); static void kickstartaccel4_OnChange(void); void SendWeaponPref(UINT8 n); -static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"}, -{1, "X-Axis"}, {2, "Y-Axis"}, {-1, "X-Axis-"}, {-2, "Y-Axis-"}, -#if JOYAXISSET > 1 -{3, "Z-Axis"}, {4, "X-Rudder"}, {-3, "Z-Axis-"}, {-4, "X-Rudder-"}, -#endif -#if JOYAXISSET > 2 -{5, "Y-Rudder"}, {6, "Z-Rudder"}, {-5, "Y-Rudder-"}, {-6, "Z-Rudder-"}, -#endif -#if JOYAXISSET > 3 -{7, "U-Axis"}, {8, "V-Axis"}, {-7, "U-Axis-"}, {-8, "V-Axis-"}, -#endif - {0, NULL}}; -#if JOYAXISSET > 4 -"More Axis Sets" -#endif - // don't mind me putting these here, I was lazy to figure out where else I could put those without blowing up the compiler. // chat timer thingy @@ -412,55 +395,6 @@ consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("kickstartaccel4", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel4_OnChange) }; -consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("joyaxis_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis2_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis3_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis4_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL) -}; - -consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("joyaxis_move", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis_move2", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis_move3", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis_move4", "None", CV_SAVE, joyaxis_cons_t, NULL) -}; - -consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("joyaxis_brake", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis2_brake", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis3_brake", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis4_brake", "None", CV_SAVE, joyaxis_cons_t, NULL) -}; - -consvar_t cv_aimaxis[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("joyaxis_aim", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis2_aim", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis3_aim", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis4_aim", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL) -}; - -consvar_t cv_lookaxis[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("joyaxis_look", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis2_look", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis3_look", "None", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis4_look", "None", CV_SAVE, joyaxis_cons_t, NULL) -}; - -consvar_t cv_fireaxis[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("joyaxis_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis_fire2", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis_fire3", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis_fire4", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL) -}; - -consvar_t cv_driftaxis[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("joyaxis_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis2_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis3_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL), - CVAR_INIT ("joyaxis4_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL) -}; - static CV_PossibleValue_t zerotoone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}}; consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("joy_deadzone", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL), @@ -469,13 +403,6 @@ consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("joy4_deadzone", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL) }; -consvar_t cv_digitaldeadzone[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("joy_digdeadzone", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL), - CVAR_INIT ("joy2_digdeadzone", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL), - CVAR_INIT ("joy3_digdeadzone", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL), - CVAR_INIT ("joy4_digdeadzone", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL) -}; - // now automatically allocated in D_RegisterClientCommands // so that it doesn't have to be updated depending on the value of MAXPLAYERS char player_names[MAXPLAYERS][MAXPLAYERNAME+1]; @@ -725,74 +652,94 @@ INT16 G_SoftwareClipAimingPitch(INT32 *aiming) return (INT16)((*aiming)>>16); } -INT32 PlayerJoyAxis(UINT8 player, axis_input_e axissel) +static INT32 KeyValue(UINT8 p, INT32 key) { - INT32 retaxis; - INT32 axisval; - boolean flp = false; - - //find what axis to get - switch (axissel) + if (key <= 0 || key >= NUMINPUTS) { - case AXISTURN: - axisval = cv_turnaxis[player-1].value; - break; - case AXISMOVE: - axisval = cv_moveaxis[player-1].value; - break; - case AXISBRAKE: - axisval = cv_brakeaxis[player-1].value; - break; - case AXISAIM: - axisval = cv_aimaxis[player-1].value; - break; - case AXISLOOK: - axisval = cv_lookaxis[player-1].value; - break; - case AXISFIRE: - axisval = cv_fireaxis[player-1].value; - break; - case AXISDRIFT: - axisval = cv_driftaxis[player-1].value; - break; - default: - return 0; - } - - if (axisval < 0) //odd -axises - { - axisval = -axisval; - flp = true; - } - if (axisval > JOYAXISSET*2 || axisval == 0) //not there in array or None return 0; - - if (axisval%2) - { - axisval /= 2; - retaxis = joyxmove[player-1][axisval]; - } - else - { - axisval--; - axisval /= 2; - retaxis = joyymove[player-1][axisval]; } - if (retaxis < (-JOYAXISRANGE)) - retaxis = -JOYAXISRANGE; - if (retaxis > (+JOYAXISRANGE)) - retaxis = +JOYAXISRANGE; + return gamekeydown[p][key]; +} - if (!Joystick[player-1].bGamepadStyle && axissel >= AXISDIGITAL) +INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, boolean menu) +{ + INT32 i; + INT32 deadzone = 0; + boolean bound = false; + + if (p >= MAXSPLITSCREENPLAYERS) { - const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_digitaldeadzone[player-1].value) >> FRACBITS; - if (-jdeadzone < retaxis && retaxis < jdeadzone) - return 0; +#ifdef PARANOIA + CONS_Debug(DBG_GAMELOGIC, "G_PlayerInputAnalog: Invalid player ID %d\n", p); +#endif + return 0; } - if (flp) retaxis = -retaxis; //flip it around - return retaxis; + deadzone = (JOYAXISRANGE * cv_deadzone[p].value) / FRACUNIT; + + for (i = 0; i < MAXINPUTMAPPING; i++) + { + INT32 key = gamecontrol[p][gc][i]; + INT32 value = 0; + + if (key <= 0 || key >= NUMINPUTS) + { + continue; + } + + value = KeyValue(p, key); + bound = true; + + if (gc == gc_a || gc == gc_b || gc == gc_c) + { + // Handle spindash key + value = max(value, KeyValue(p, gamecontrol[p][gc_abc][i])); + } + + if (value >= deadzone) + { + return value; + } + } + + if (menu == true && bound == false) + { + // We don't want menus to become unnavigable if people unbind + // all of their controls, so use the default control scheme in + // this scenario. + + for (i = 0; i < MAXINPUTMAPPING; i++) + { + INT32 key = gamecontroldefault[gc][i]; + INT32 value = 0; + + if (key <= 0 || key >= NUMINPUTS) + { + continue; + } + + value = KeyValue(p, key); + + if (gc == gc_a || gc == gc_b || gc == gc_c) + { + // Handle spindash key + value = max(value, KeyValue(p, gamecontroldefault[gc_abc][i])); + } + + if (value >= deadzone) + { + return value; + } + } + } + + return 0; +} + +boolean G_PlayerInputDown(UINT8 p, INT32 gc, boolean menu) +{ + return (G_PlayerInputAnalog(p, gc, menu) != 0); } // Take a magnitude of two axes, and adjust it to take out the deadzone @@ -867,27 +814,15 @@ angle_t localangle[MAXSPLITSCREENPLAYERS]; void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { const UINT8 forplayer = ssplayer-1; - - const INT32 lookaxis = cv_lookaxis[forplayer].value; - const boolean invertmouse = cv_invertmouse.value; - const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle; - const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle; - const boolean usejoystick = (analogjoystickmove || gamepadjoystickmove); - - static boolean keyboard_look[MAXSPLITSCREENPLAYERS]; // true if lookup/down using keyboard - static boolean resetdown[MAXSPLITSCREENPLAYERS]; // don't cam reset every frame - - INT32 forward, axis; + INT32 forward; joystickvector2_t joystickvector; - boolean turnleft, turnright; - player_t *player = &players[g_localplayers[forplayer]]; - camera_t *thiscam = &camera[forplayer]; - boolean *kbl = &keyboard_look[forplayer]; - boolean *rd = &resetdown[forplayer]; - const boolean mouseaiming = player->spectator; + //camera_t *thiscam = &camera[forplayer]; + //boolean *kbl = &keyboard_look[forplayer]; + //boolean *rd = &resetdown[forplayer]; + //const boolean mouseaiming = player->spectator; (void)realtics; @@ -924,10 +859,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) return; } - turnright = PlayerInputDown(ssplayer, gc_turnright); - turnleft = PlayerInputDown(ssplayer, gc_turnleft); - - joystickvector.xaxis = PlayerJoyAxis(ssplayer, AXISTURN); + joystickvector.xaxis = G_PlayerInputAnalog(forplayer, gc_right, false) - G_PlayerInputAnalog(forplayer, gc_left, false); joystickvector.yaxis = 0; G_HandleAxisDeadZone(forplayer, &joystickvector); @@ -935,138 +867,92 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // use it for aiming to throw items forward/backward and the vote screen // This mean that the turn axis will still be gradient but up/down will be 0 // until the stick is pushed far enough - joystickvector.yaxis = PlayerJoyAxis(ssplayer, AXISAIM); + joystickvector.yaxis = G_PlayerInputAnalog(forplayer, gc_down, false) - G_PlayerInputAnalog(forplayer, gc_up, false); if (encoremode) { - turnright ^= turnleft; // swap these using three XORs - turnleft ^= turnright; - turnright ^= turnleft; joystickvector.xaxis = -joystickvector.xaxis; } - if (gamepadjoystickmove && joystickvector.xaxis != 0) - { - turnright = turnright || (joystickvector.xaxis > 0); - turnleft = turnleft || (joystickvector.xaxis < 0); - } forward = 0; - cmd->turning = 0; - // let movement keys cancel each other out - if (turnright && !(turnleft)) - { - cmd->turning -= KART_FULLTURN; - } - else if (turnleft && !(turnright)) - { - cmd->turning += KART_FULLTURN; - } - - if (analogjoystickmove && joystickvector.xaxis != 0) + if (joystickvector.xaxis != 0) { cmd->turning -= (joystickvector.xaxis * KART_FULLTURN) >> 10; } - // Specator mouse turning - if (player->spectator) - { - cmd->turning -= (mousex * 8) * (encoremode ? -1 : 1); - } - if (player->spectator || objectplacing) // SRB2Kart: spectators need special controls { - axis = PlayerJoyAxis(ssplayer, AXISMOVE); - if (PlayerInputDown(ssplayer, gc_accelerate) || (usejoystick && axis > 0)) + if (G_PlayerInputDown(forplayer, gc_a, false)) + { cmd->buttons |= BT_ACCELERATE; - axis = PlayerJoyAxis(ssplayer, AXISBRAKE); - if (PlayerInputDown(ssplayer, gc_brake) || (usejoystick && axis > 0)) + } + + if (G_PlayerInputDown(forplayer, gc_b, false)) + { cmd->buttons |= BT_BRAKE; - axis = PlayerJoyAxis(ssplayer, AXISAIM); - if (PlayerInputDown(ssplayer, gc_aimforward) || (usejoystick && axis < 0)) + } + + if (joystickvector.yaxis < 0) + { forward += MAXPLMOVE; - if (PlayerInputDown(ssplayer, gc_aimbackward) || (usejoystick && axis > 0)) + } + + if (joystickvector.yaxis > 0) + { forward -= MAXPLMOVE; + } } else { // forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward. - axis = PlayerJoyAxis(ssplayer, AXISMOVE); - if (PlayerInputDown(ssplayer, gc_accelerate) || (gamepadjoystickmove && axis > 0)) + fixed_t value = G_PlayerInputAnalog(forplayer, gc_a, false); + if (value != 0) { cmd->buttons |= BT_ACCELERATE; - forward = MAXPLMOVE; // 50 - } - else if (analogjoystickmove && axis > 0) - { - cmd->buttons |= BT_ACCELERATE; - // JOYAXISRANGE is supposed to be 1023 (divide by 1024) - forward += ((axis * MAXPLMOVE) >> 10); + forward += ((value * MAXPLMOVE) >> 10); } - axis = PlayerJoyAxis(ssplayer, AXISBRAKE); - if (PlayerInputDown(ssplayer, gc_brake) || (gamepadjoystickmove && axis > 0)) + value = G_PlayerInputAnalog(forplayer, gc_b, false); + if (value != 0) { cmd->buttons |= BT_BRAKE; - if (cmd->buttons & BT_ACCELERATE || cmd->forwardmove <= 0) - forward -= MAXPLMOVE; - } - else if (analogjoystickmove && axis > 0) - { - cmd->buttons |= BT_BRAKE; - // JOYAXISRANGE is supposed to be 1023 (divide by 1024) - if (cmd->buttons & BT_ACCELERATE || cmd->forwardmove <= 0) - forward -= ((axis * MAXPLMOVE) >> 10); + forward -= ((value * MAXPLMOVE) >> 10); } // But forward/backward IS used for aiming. - if (PlayerInputDown(ssplayer, gc_aimforward) || (joystickvector.yaxis < 0)) + if (joystickvector.yaxis < 0) + { cmd->buttons |= BT_FORWARD; - if (PlayerInputDown(ssplayer, gc_aimbackward) || (joystickvector.yaxis > 0)) + } + + if (joystickvector.yaxis > 0) + { cmd->buttons |= BT_BACKWARD; + } } // fire with any button/key - axis = PlayerJoyAxis(ssplayer, AXISFIRE); - if (PlayerInputDown(ssplayer, gc_fire) || (usejoystick && axis > 0)) + if (G_PlayerInputDown(forplayer, gc_c, false)) + { cmd->buttons |= BT_ATTACK; + } // drift with any button/key - axis = PlayerJoyAxis(ssplayer, AXISDRIFT); - if (PlayerInputDown(ssplayer, gc_drift) || (usejoystick && axis > 0)) + if (G_PlayerInputDown(forplayer, gc_x, false)) + { cmd->buttons |= BT_DRIFT; - - // Spindash with any button/key - // Simply holds all of the inputs for you. - axis = PlayerJoyAxis(ssplayer, AXISSPINDASH); - if (PlayerInputDown(ssplayer, gc_spindash) || (usejoystick && axis > 0)) - cmd->buttons |= (BT_ACCELERATE|BT_BRAKE|BT_DRIFT); + } // rear view with any button/key - axis = PlayerJoyAxis(ssplayer, AXISLOOKBACK); - if (PlayerInputDown(ssplayer, gc_lookback) || (usejoystick && axis > 0)) - cmd->buttons |= BT_LOOKBACK; - - // Lua scriptable buttons - if (PlayerInputDown(ssplayer, gc_custom1)) - cmd->buttons |= BT_CUSTOM1; - if (PlayerInputDown(ssplayer, gc_custom2)) - cmd->buttons |= BT_CUSTOM2; - if (PlayerInputDown(ssplayer, gc_custom3)) - cmd->buttons |= BT_CUSTOM3; - - // Reset camera - if (PlayerInputDown(ssplayer, gc_camreset)) + if (G_PlayerInputDown(forplayer, gc_y, false)) { - if (thiscam->chase && *rd == false) - P_ResetCamera(player, thiscam); - *rd = true; + cmd->buttons |= BT_LOOKBACK; } - else - *rd = false; // spectator aiming shit, ahhhh... + /* { INT32 player_invert = invertmouse ? -1 : 1; INT32 screen_invert = @@ -1074,15 +960,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) && (!thiscam->chase)) //because chasecam's not inverted ? -1 : 1; // set to -1 or 1 to multiply - // mouse look stuff (mouse look is not the same as mouse aim) - if (mouseaiming && player->spectator) - { - *kbl = false; - - // looking up/down - cmd->aiming += (mlooky<<19)*player_invert*screen_invert; - } - axis = PlayerJoyAxis(ssplayer, AXISLOOK); if (analogjoystickmove && axis != 0 && lookaxis && player->spectator) cmd->aiming += (axis<<16) * screen_invert; @@ -1108,11 +985,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (PlayerInputDown(ssplayer, gc_centerview)) // No need to put a spectator limit on this one though :V cmd->aiming = 0; } - - mousex = mousey = mlooky = 0; + */ cmd->forwardmove += (SINT8)forward; - cmd->flags = 0; if (chat_on || CON_Ready()) @@ -1210,7 +1085,7 @@ static void kickstartaccel4_OnChange(void) // void G_DoLoadLevel(boolean resetplayer) { - INT32 i, j; + INT32 i; // Make sure objectplace is OFF when you first start the level! OP_ResetObjectplace(); @@ -1270,12 +1145,6 @@ void G_DoLoadLevel(boolean resetplayer) // clear cmd building stuff memset(gamekeydown, 0, sizeof (gamekeydown)); - for (i = 0;i < JOYAXISSET; i++) - { - for (j = 0; j < MAXSPLITSCREENPLAYERS; j++) - joyxmove[j][i] = joyymove[j][i] = 0; - } - mousex = mousey = 0; // clear hud messages remains (usually from game startup) CON_ClearHUD(); @@ -1361,7 +1230,7 @@ static INT32 camtoggledelay[MAXSPLITSCREENPLAYERS]; // boolean G_Responder(event_t *ev) { - UINT8 i; + //INT32 i; // any other key pops up menu if in demos if (gameaction == ga_nothing && !demo.quitafterplaying && @@ -1456,7 +1325,7 @@ boolean G_Responder(event_t *ev) // allow spy mode changes even during the demo if (gamestate == GS_LEVEL && ev->type == ev_keydown - && (ev->data1 == KEY_F12 || ev->data1 == gamecontrol[0][gc_viewpoint][0] || ev->data1 == gamecontrol[0][gc_viewpoint][1])) + && (ev->data1 == KEY_F12 /*|| ev->data1 == gamecontrol[0][gc_viewpoint][0] || ev->data1 == gamecontrol[0][gc_viewpoint][1]*/)) { if (!demo.playback && (r_splitscreen || !netgame)) g_localplayers[0] = consoleplayer; @@ -1474,6 +1343,7 @@ boolean G_Responder(event_t *ev) if (gamestate == GS_LEVEL && ev->type == ev_keydown && multiplayer && demo.playback && !demo.freecam) { + /* if (ev->data1 == gamecontrol[1][gc_viewpoint][0] || ev->data1 == gamecontrol[1][gc_viewpoint][1]) { G_AdjustView(2, 1, true); @@ -1489,12 +1359,13 @@ boolean G_Responder(event_t *ev) G_AdjustView(4, 1, true); return true; } + */ // Allow pausing if ( - ev->data1 == gamecontrol[0][gc_pause][0] - || ev->data1 == gamecontrol[0][gc_pause][1] - || ev->data1 == KEY_PAUSE + //ev->data1 == gamecontrol[0][gc_pause][0] + //|| ev->data1 == gamecontrol[0][gc_pause][1] + ev->data1 == KEY_PAUSE ) { paused = !paused; @@ -1528,9 +1399,9 @@ boolean G_Responder(event_t *ev) switch (ev->type) { case ev_keydown: - if (ev->data1 == gamecontrol[0][gc_pause][0] - || ev->data1 == gamecontrol[0][gc_pause][1] - || ev->data1 == KEY_PAUSE) + if (//ev->data1 == gamecontrol[0][gc_pause][0] + //|| ev->data1 == gamecontrol[0][gc_pause][1] + ev->data1 == KEY_PAUSE) { if (modeattacking && !demo.playback && (gamestate == GS_LEVEL)) { @@ -1560,6 +1431,7 @@ boolean G_Responder(event_t *ev) } } + /* for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { if (ev->data1 == gamecontrol[i][gc_camtoggle][0] @@ -1572,6 +1444,7 @@ boolean G_Responder(event_t *ev) } } } + */ return true; @@ -1584,15 +1457,6 @@ boolean G_Responder(event_t *ev) case ev_joystick: return true; // eat events - case ev_joystick2: - return true; // eat events - - case ev_joystick3: - return true; // eat events - - case ev_joystick4: - return true; // eat events - default: break; } diff --git a/src/g_game.h b/src/g_game.h index 9e4ef0159..5f66b6ff6 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -55,15 +55,7 @@ extern consvar_t cv_pauseifunfocused; extern consvar_t cv_invertmouse; extern consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_aimaxis[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_lookaxis[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_fireaxis[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_driftaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS]; -extern consvar_t cv_digitaldeadzone[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_ghost_besttime, cv_ghost_bestlap, cv_ghost_last, cv_ghost_guest, cv_ghost_staff; @@ -93,29 +85,12 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n); INT32 G_ClipAimingPitch(INT32 *aiming); INT16 G_SoftwareClipAimingPitch(INT32 *aiming); -typedef enum -{ - AXISNONE = 0, - - AXISTURN, - AXISMOVE, - AXISBRAKE, - AXISLOOK, - - AXISDIGITAL, // axes below this use digital deadzone - - AXISFIRE = AXISDIGITAL, - AXISDRIFT, - AXISSPINDASH, - AXISLOOKBACK, - AXISAIM, -} axis_input_e; - -INT32 PlayerJoyAxis(UINT8 player, axis_input_e axissel); - extern angle_t localangle[MAXSPLITSCREENPLAYERS]; extern INT32 localaiming[MAXSPLITSCREENPLAYERS]; // should be an angle_t but signed +INT32 G_PlayerInputAnalog(UINT8 p, INT32 gc, boolean menu); +boolean G_PlayerInputDown(UINT8 p, INT32 gc, boolean menu); + // // GAME // diff --git a/src/g_input.c b/src/g_input.c index 72c7033fa..0cd044f67 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -31,32 +31,28 @@ consvar_t cv_mouseysens = CVAR_INIT ("mouseysens", "20", CV_SAVE, mousesens_cons consvar_t cv_mouseysens2 = CVAR_INIT ("mouseysens2", "20", CV_SAVE, mousesens_cons_t, NULL); consvar_t cv_controlperkey = CVAR_INIT ("controlperkey", "One", CV_SAVE, onecontrolperkey_cons_t, NULL); -INT32 mousex, mousey; -INT32 mlooky; // like mousey but with a custom sensitivity for mlook - -// joystick values are repeated -INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET]; - -// current state of the keys: true if pushed -UINT8 gamekeydown[NUMINPUTS]; +// current state of the keys +// FRACUNIT for fully pressed, 0 for not pressed +INT32 gamekeydown[MAXSPLITSCREENPLAYERS][NUMINPUTS]; // two key codes (or virtual key) per game control -INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][2]; -INT32 gamecontroldefault[MAXSPLITSCREENPLAYERS][num_gamecontrolschemes][num_gamecontrols][2]; // default control storage, use 0 (gcs_custom) for memory retention +INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][MAXINPUTMAPPING]; +INT32 gamecontroldefault[num_gamecontrols][MAXINPUTMAPPING]; // default control storage // lists of GC codes for selective operation -const INT32 gcl_accelerate[num_gcl_accelerate] = { gc_accelerate }; +/* +const INT32 gcl_accelerate[num_gcl_accelerate] = { gc_a }; -const INT32 gcl_brake[num_gcl_brake] = { gc_brake }; +const INT32 gcl_brake[num_gcl_brake] = { gc_b }; -const INT32 gcl_drift[num_gcl_drift] = { gc_drift }; +const INT32 gcl_drift[num_gcl_drift] = { gc_c }; const INT32 gcl_spindash[num_gcl_spindash] = { - gc_accelerate, gc_drift, gc_brake, gc_spindash + gc_a, gc_b, gc_c, gc_abc }; const INT32 gcl_movement[num_gcl_movement] = { - gc_accelerate, gc_drift, gc_brake, gc_spindash, gc_turnleft, gc_turnright + gc_a, gc_b, gc_c, gc_abc, gc_left, gc_right }; const INT32 gcl_item[num_gcl_item] = { @@ -64,22 +60,11 @@ const INT32 gcl_item[num_gcl_item] = { }; const INT32 gcl_full[num_gcl_full] = { - gc_accelerate, gc_drift, gc_brake, gc_spindash, gc_turnleft, gc_turnright, + gc_a, gc_drift, gc_b, gc_spindash, gc_turnleft, gc_turnright, gc_fire, gc_aimforward, gc_aimbackward, gc_lookback }; - -typedef struct -{ - UINT8 time; - UINT8 state; - UINT8 clicks; -} dclick_t; -static dclick_t mousedclicks[MOUSEBUTTONS]; -static dclick_t joydclicks[MAXSPLITSCREENPLAYERS][JOYBUTTONS + JOYHATS*4]; - -// protos -static UINT8 G_CheckDoubleClick(UINT8 state, dclick_t *dt); +*/ // // Remaps the inputs to game controls. @@ -91,137 +76,131 @@ static UINT8 G_CheckDoubleClick(UINT8 state, dclick_t *dt); void G_MapEventsToControls(event_t *ev) { INT32 i; - UINT8 flag; switch (ev->type) { case ev_keydown: if (ev->data1 < NUMINPUTS) - gamekeydown[ev->data1] = 1; + { + gamekeydown[ev->device][ev->data1] = FRACUNIT; + } #ifdef PARANOIA else { - CONS_Debug(DBG_GAMELOGIC, "Bad downkey input %d\n",ev->data1); + CONS_Debug(DBG_GAMELOGIC, "Bad downkey input %d\n", ev->data1); } - #endif break; case ev_keyup: if (ev->data1 < NUMINPUTS) - gamekeydown[ev->data1] = 0; + { + gamekeydown[ev->device][ev->data1] = 0; + } #ifdef PARANOIA else { - CONS_Debug(DBG_GAMELOGIC, "Bad upkey input %d\n",ev->data1); + CONS_Debug(DBG_GAMELOGIC, "Bad upkey input %d\n", ev->data1); } #endif break; case ev_mouse: // buttons are virtual keys - if (menuactive || CON_Ready() || chat_on) + if (menuactive) + { break; - mousex = (INT32)(ev->data2*((cv_mousesens.value*cv_mousesens.value)/110.0f + 0.1f)); - mousey = (INT32)(ev->data3*((cv_mousesens.value*cv_mousesens.value)/110.0f + 0.1f)); - mlooky = (INT32)(ev->data3*((cv_mouseysens.value*cv_mousesens.value)/110.0f + 0.1f)); + } + + // X axis + if (ev->data2 < 0) + { + // Left + gamekeydown[ev->device][KEY_MOUSEMOVE + 2] = abs(ev->data2); + gamekeydown[ev->device][KEY_MOUSEMOVE + 3] = 0; + } + else + { + // Right + gamekeydown[ev->device][KEY_MOUSEMOVE + 2] = 0; + gamekeydown[ev->device][KEY_MOUSEMOVE + 3] = abs(ev->data2); + } + + // Y axis + if (ev->data3 < 0) + { + // Up + gamekeydown[ev->device][KEY_MOUSEMOVE] = abs(ev->data3); + gamekeydown[ev->device][KEY_MOUSEMOVE + 1] = 0; + } + else + { + // Down + gamekeydown[ev->device][KEY_MOUSEMOVE] = 0; + gamekeydown[ev->device][KEY_MOUSEMOVE + 1] = abs(ev->data3); + } break; case ev_joystick: // buttons are virtual keys - i = ev->data1; - if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on) + if (menuactive) + { break; - if (ev->data2 != INT32_MAX) joyxmove[0][i] = ev->data2; - if (ev->data3 != INT32_MAX) joyymove[0][i] = ev->data3; - break; + } - case ev_joystick2: // buttons are virtual keys - i = ev->data1; - if (i >= JOYAXISSET || menuactive) + if (ev->data1 >= JOYAXISSET) + { +#ifdef PARANOIA + CONS_Debug(DBG_GAMELOGIC, "Bad joystick axis event %d\n", ev->data1); +#endif break; - if (ev->data2 != INT32_MAX) joyxmove[1][i] = ev->data2; - if (ev->data3 != INT32_MAX) joyymove[1][i] = ev->data3; - break; + } - case ev_joystick3: - i = ev->data1; - if (i >= JOYAXISSET) - break; - if (ev->data2 != INT32_MAX) joyxmove[2][i] = ev->data2; - if (ev->data3 != INT32_MAX) joyymove[2][i] = ev->data3; - break; + i = ev->data1 * 4; + + if (ev->device == 0) + { + if (CON_Ready() || chat_on) + break; + } + + if (ev->data2 != INT32_MAX) + { + // X axis + if (ev->data2 < 0) + { + // Left + gamekeydown[ev->device][KEY_AXIS1 + i] = abs(ev->data2); + gamekeydown[ev->device][KEY_AXIS1 + i + 1] = 0; + } + else + { + // Right + gamekeydown[ev->device][KEY_AXIS1 + i] = 0; + gamekeydown[ev->device][KEY_AXIS1 + i + 1] = abs(ev->data2); + } + } + + if (ev->data3 != INT32_MAX) + { + // Y axis + if (ev->data3 < 0) + { + // Up + gamekeydown[ev->device][KEY_AXIS1 + i + 2] = abs(ev->data3); + gamekeydown[ev->device][KEY_AXIS1 + i + 3] = 0; + } + else + { + // Down + gamekeydown[ev->device][KEY_AXIS1 + i + 2] = 0; + gamekeydown[ev->device][KEY_AXIS1 + i + 3] = abs(ev->data3); + } + } - case ev_joystick4: - i = ev->data1; - if (i >= JOYAXISSET) - break; - if (ev->data2 != INT32_MAX) joyxmove[3][i] = ev->data2; - if (ev->data3 != INT32_MAX) joyymove[3][i] = ev->data3; break; default: break; } - - // ALWAYS check for mouse & joystick double-clicks even if no mouse event - for (i = 0; i < MOUSEBUTTONS; i++) - { - flag = G_CheckDoubleClick(gamekeydown[KEY_MOUSE1+i], &mousedclicks[i]); - gamekeydown[KEY_DBLMOUSE1+i] = flag; - } - - for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++) - { - flag = G_CheckDoubleClick(gamekeydown[KEY_JOY1+i], &joydclicks[0][i]); - gamekeydown[KEY_DBLJOY1+i] = flag; - } - - for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++) - { - flag = G_CheckDoubleClick(gamekeydown[KEY_2JOY1+i], &joydclicks[1][i]); - gamekeydown[KEY_DBL2JOY1+i] = flag; - } - - for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++) - { - flag = G_CheckDoubleClick(gamekeydown[KEY_3JOY1+i], &joydclicks[2][i]); - gamekeydown[KEY_DBL3JOY1+i] = flag; - } - - for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++) - { - flag = G_CheckDoubleClick(gamekeydown[KEY_4JOY1+i], &joydclicks[3][i]); - gamekeydown[KEY_DBL4JOY1+i] = flag; - } -} - -// -// General double-click detection routine for any kind of input. -// -static UINT8 G_CheckDoubleClick(UINT8 state, dclick_t *dt) -{ - if (state != dt->state && dt->time > 1) - { - dt->state = state; - if (state) - dt->clicks++; - if (dt->clicks == 2) - { - dt->clicks = 0; - return true; - } - else - dt->time = 0; - } - else - { - dt->time++; - if (dt->time > 20) - { - dt->clicks = 0; - dt->state = 0; - } - } - return false; } typedef struct @@ -239,12 +218,12 @@ static keyname_t keynames[] = {KEY_ESCAPE, "ESCAPE"}, {KEY_BACKSPACE, "BACKSPACE"}, - {KEY_NUMLOCK, "NUMLOCK"}, - {KEY_SCROLLLOCK, "SCROLLLOCK"}, + {KEY_NUMLOCK, "NUM LOCK"}, + {KEY_SCROLLLOCK, "SCROLL LOCK"}, // bill gates keys - {KEY_LEFTWIN, "LEFTWIN"}, - {KEY_RIGHTWIN, "RIGHTWIN"}, + {KEY_LEFTWIN, "LWINDOWS"}, + {KEY_RIGHTWIN, "RWINDOWS"}, {KEY_MENU, "MENU"}, {KEY_LSHIFT, "LSHIFT"}, @@ -276,14 +255,14 @@ static keyname_t keynames[] = // extended keys (not keypad) {KEY_HOME, "HOME"}, {KEY_UPARROW, "UP ARROW"}, - {KEY_PGUP, "PGUP"}, + {KEY_PGUP, "PAGE UP"}, {KEY_LEFTARROW, "LEFT ARROW"}, {KEY_RIGHTARROW, "RIGHT ARROW"}, {KEY_END, "END"}, {KEY_DOWNARROW, "DOWN ARROW"}, - {KEY_PGDN, "PGDN"}, - {KEY_INS, "INS"}, - {KEY_DEL, "DEL"}, + {KEY_PGDN, "PAGE DOWN"}, + {KEY_INS, "INSERT"}, + {KEY_DEL, "DELETE"}, // other keys {KEY_F1, "F1"}, @@ -312,10 +291,12 @@ static keyname_t keynames[] = {KEY_MOUSE1+5,"MOUSE6"}, {KEY_MOUSE1+6,"MOUSE7"}, {KEY_MOUSE1+7,"MOUSE8"}, - {KEY_MOUSEWHEELUP, "Wheel 1 UP"}, - {KEY_MOUSEWHEELDOWN, "Wheel 1 Down"}, - {KEY_2MOUSEWHEELUP, "Wheel 2 UP"}, - {KEY_2MOUSEWHEELDOWN, "Wheel 2 Down"}, + {KEY_MOUSEMOVE+0,"Mouse Up"}, + {KEY_MOUSEMOVE+1,"Mouse Down"}, + {KEY_MOUSEMOVE+2,"Mouse Left"}, + {KEY_MOUSEMOVE+3,"Mouse Right"}, + {KEY_MOUSEWHEELUP, "Wheel Up"}, + {KEY_MOUSEWHEELDOWN, "Wheel Down"}, {KEY_JOY1+0, "JOY1"}, {KEY_JOY1+1, "JOY2"}, @@ -352,6 +333,7 @@ static keyname_t keynames[] = {KEY_JOY1+30, "JOY31"}, {KEY_JOY1+31, "JOY32"}, #endif + // the DOS version uses Allegro's joystick support {KEY_HAT1+0, "HATUP"}, {KEY_HAT1+1, "HATDOWN"}, @@ -370,404 +352,42 @@ static keyname_t keynames[] = {KEY_HAT1+14, "HATLEFT4"}, {KEY_HAT1+15, "HATRIGHT4"}, - {KEY_DBLMOUSE1+0, "DBLMOUSE1"}, - {KEY_DBLMOUSE1+1, "DBLMOUSE2"}, - {KEY_DBLMOUSE1+2, "DBLMOUSE3"}, - {KEY_DBLMOUSE1+3, "DBLMOUSE4"}, - {KEY_DBLMOUSE1+4, "DBLMOUSE5"}, - {KEY_DBLMOUSE1+5, "DBLMOUSE6"}, - {KEY_DBLMOUSE1+6, "DBLMOUSE7"}, - {KEY_DBLMOUSE1+7, "DBLMOUSE8"}, - - {KEY_DBLJOY1+0, "DBLJOY1"}, - {KEY_DBLJOY1+1, "DBLJOY2"}, - {KEY_DBLJOY1+2, "DBLJOY3"}, - {KEY_DBLJOY1+3, "DBLJOY4"}, - {KEY_DBLJOY1+4, "DBLJOY5"}, - {KEY_DBLJOY1+5, "DBLJOY6"}, - {KEY_DBLJOY1+6, "DBLJOY7"}, - {KEY_DBLJOY1+7, "DBLJOY8"}, -#if !defined (NOMOREJOYBTN_1DBL) - {KEY_DBLJOY1+8, "DBLJOY9"}, - {KEY_DBLJOY1+9, "DBLJOY10"}, - {KEY_DBLJOY1+10, "DBLJOY11"}, - {KEY_DBLJOY1+11, "DBLJOY12"}, - {KEY_DBLJOY1+12, "DBLJOY13"}, - {KEY_DBLJOY1+13, "DBLJOY14"}, - {KEY_DBLJOY1+14, "DBLJOY15"}, - {KEY_DBLJOY1+15, "DBLJOY16"}, - {KEY_DBLJOY1+16, "DBLJOY17"}, - {KEY_DBLJOY1+17, "DBLJOY18"}, - {KEY_DBLJOY1+18, "DBLJOY19"}, - {KEY_DBLJOY1+19, "DBLJOY20"}, - {KEY_DBLJOY1+20, "DBLJOY21"}, - {KEY_DBLJOY1+21, "DBLJOY22"}, - {KEY_DBLJOY1+22, "DBLJOY23"}, - {KEY_DBLJOY1+23, "DBLJOY24"}, - {KEY_DBLJOY1+24, "DBLJOY25"}, - {KEY_DBLJOY1+25, "DBLJOY26"}, - {KEY_DBLJOY1+26, "DBLJOY27"}, - {KEY_DBLJOY1+27, "DBLJOY28"}, - {KEY_DBLJOY1+28, "DBLJOY29"}, - {KEY_DBLJOY1+29, "DBLJOY30"}, - {KEY_DBLJOY1+30, "DBLJOY31"}, - {KEY_DBLJOY1+31, "DBLJOY32"}, -#endif - {KEY_DBLHAT1+0, "DBLHATUP"}, - {KEY_DBLHAT1+1, "DBLHATDOWN"}, - {KEY_DBLHAT1+2, "DBLHATLEFT"}, - {KEY_DBLHAT1+3, "DBLHATRIGHT"}, - {KEY_DBLHAT1+4, "DBLHATUP2"}, - {KEY_DBLHAT1+5, "DBLHATDOWN2"}, - {KEY_DBLHAT1+6, "DBLHATLEFT2"}, - {KEY_DBLHAT1+7, "DBLHATRIGHT2"}, - {KEY_DBLHAT1+8, "DBLHATUP3"}, - {KEY_DBLHAT1+9, "DBLHATDOWN3"}, - {KEY_DBLHAT1+10, "DBLHATLEFT3"}, - {KEY_DBLHAT1+11, "DBLHATRIGHT3"}, - {KEY_DBLHAT1+12, "DBLHATUP4"}, - {KEY_DBLHAT1+13, "DBLHATDOWN4"}, - {KEY_DBLHAT1+14, "DBLHATLEFT4"}, - {KEY_DBLHAT1+15, "DBLHATRIGHT4"}, - - {KEY_2JOY1+0, "SEC_JOY1"}, - {KEY_2JOY1+1, "SEC_JOY2"}, - {KEY_2JOY1+2, "SEC_JOY3"}, - {KEY_2JOY1+3, "SEC_JOY4"}, - {KEY_2JOY1+4, "SEC_JOY5"}, - {KEY_2JOY1+5, "SEC_JOY6"}, - {KEY_2JOY1+6, "SEC_JOY7"}, - {KEY_2JOY1+7, "SEC_JOY8"}, -#if !defined (NOMOREJOYBTN_2S) - // we use up to 32 buttons in DirectInput - {KEY_2JOY1+8, "SEC_JOY9"}, - {KEY_2JOY1+9, "SEC_JOY10"}, - {KEY_2JOY1+10, "SEC_JOY11"}, - {KEY_2JOY1+11, "SEC_JOY12"}, - {KEY_2JOY1+12, "SEC_JOY13"}, - {KEY_2JOY1+13, "SEC_JOY14"}, - {KEY_2JOY1+14, "SEC_JOY15"}, - {KEY_2JOY1+15, "SEC_JOY16"}, - {KEY_2JOY1+16, "SEC_JOY17"}, - {KEY_2JOY1+17, "SEC_JOY18"}, - {KEY_2JOY1+18, "SEC_JOY19"}, - {KEY_2JOY1+19, "SEC_JOY20"}, - {KEY_2JOY1+20, "SEC_JOY21"}, - {KEY_2JOY1+21, "SEC_JOY22"}, - {KEY_2JOY1+22, "SEC_JOY23"}, - {KEY_2JOY1+23, "SEC_JOY24"}, - {KEY_2JOY1+24, "SEC_JOY25"}, - {KEY_2JOY1+25, "SEC_JOY26"}, - {KEY_2JOY1+26, "SEC_JOY27"}, - {KEY_2JOY1+27, "SEC_JOY28"}, - {KEY_2JOY1+28, "SEC_JOY29"}, - {KEY_2JOY1+29, "SEC_JOY30"}, - {KEY_2JOY1+30, "SEC_JOY31"}, - {KEY_2JOY1+31, "SEC_JOY32"}, -#endif - // the DOS version uses Allegro's joystick support - {KEY_2HAT1+0, "SEC_HATUP"}, - {KEY_2HAT1+1, "SEC_HATDOWN"}, - {KEY_2HAT1+2, "SEC_HATLEFT"}, - {KEY_2HAT1+3, "SEC_HATRIGHT"}, - {KEY_2HAT1+4, "SEC_HATUP2"}, - {KEY_2HAT1+5, "SEC_HATDOWN2"}, - {KEY_2HAT1+6, "SEC_HATLEFT2"}, - {KEY_2HAT1+7, "SEC_HATRIGHT2"}, - {KEY_2HAT1+8, "SEC_HATUP3"}, - {KEY_2HAT1+9, "SEC_HATDOWN3"}, - {KEY_2HAT1+10, "SEC_HATLEFT3"}, - {KEY_2HAT1+11, "SEC_HATRIGHT3"}, - {KEY_2HAT1+12, "SEC_HATUP4"}, - {KEY_2HAT1+13, "SEC_HATDOWN4"}, - {KEY_2HAT1+14, "SEC_HATLEFT4"}, - {KEY_2HAT1+15, "SEC_HATRIGHT4"}, - - {KEY_DBL2JOY1+0, "DBLSEC_JOY1"}, - {KEY_DBL2JOY1+1, "DBLSEC_JOY2"}, - {KEY_DBL2JOY1+2, "DBLSEC_JOY3"}, - {KEY_DBL2JOY1+3, "DBLSEC_JOY4"}, - {KEY_DBL2JOY1+4, "DBLSEC_JOY5"}, - {KEY_DBL2JOY1+5, "DBLSEC_JOY6"}, - {KEY_DBL2JOY1+6, "DBLSEC_JOY7"}, - {KEY_DBL2JOY1+7, "DBLSEC_JOY8"}, -#if !defined (NOMOREJOYBTN_2DBL) - {KEY_DBL2JOY1+8, "DBLSEC_JOY9"}, - {KEY_DBL2JOY1+9, "DBLSEC_JOY10"}, - {KEY_DBL2JOY1+10, "DBLSEC_JOY11"}, - {KEY_DBL2JOY1+11, "DBLSEC_JOY12"}, - {KEY_DBL2JOY1+12, "DBLSEC_JOY13"}, - {KEY_DBL2JOY1+13, "DBLSEC_JOY14"}, - {KEY_DBL2JOY1+14, "DBLSEC_JOY15"}, - {KEY_DBL2JOY1+15, "DBLSEC_JOY16"}, - {KEY_DBL2JOY1+16, "DBLSEC_JOY17"}, - {KEY_DBL2JOY1+17, "DBLSEC_JOY18"}, - {KEY_DBL2JOY1+18, "DBLSEC_JOY19"}, - {KEY_DBL2JOY1+19, "DBLSEC_JOY20"}, - {KEY_DBL2JOY1+20, "DBLSEC_JOY21"}, - {KEY_DBL2JOY1+21, "DBLSEC_JOY22"}, - {KEY_DBL2JOY1+22, "DBLSEC_JOY23"}, - {KEY_DBL2JOY1+23, "DBLSEC_JOY24"}, - {KEY_DBL2JOY1+24, "DBLSEC_JOY25"}, - {KEY_DBL2JOY1+25, "DBLSEC_JOY26"}, - {KEY_DBL2JOY1+26, "DBLSEC_JOY27"}, - {KEY_DBL2JOY1+27, "DBLSEC_JOY28"}, - {KEY_DBL2JOY1+28, "DBLSEC_JOY29"}, - {KEY_DBL2JOY1+29, "DBLSEC_JOY30"}, - {KEY_DBL2JOY1+30, "DBLSEC_JOY31"}, - {KEY_DBL2JOY1+31, "DBLSEC_JOY32"}, -#endif - {KEY_DBL2HAT1+0, "DBLSEC_HATUP"}, - {KEY_DBL2HAT1+1, "DBLSEC_HATDOWN"}, - {KEY_DBL2HAT1+2, "DBLSEC_HATLEFT"}, - {KEY_DBL2HAT1+3, "DBLSEC_HATRIGHT"}, - {KEY_DBL2HAT1+4, "DBLSEC_HATUP2"}, - {KEY_DBL2HAT1+5, "DBLSEC_HATDOWN2"}, - {KEY_DBL2HAT1+6, "DBLSEC_HATLEFT2"}, - {KEY_DBL2HAT1+7, "DBLSEC_HATRIGHT2"}, - {KEY_DBL2HAT1+8, "DBLSEC_HATUP3"}, - {KEY_DBL2HAT1+9, "DBLSEC_HATDOWN3"}, - {KEY_DBL2HAT1+10, "DBLSEC_HATLEFT3"}, - {KEY_DBL2HAT1+11, "DBLSEC_HATRIGHT3"}, - {KEY_DBL2HAT1+12, "DBLSEC_HATUP4"}, - {KEY_DBL2HAT1+13, "DBLSEC_HATDOWN4"}, - {KEY_DBL2HAT1+14, "DBLSEC_HATLEFT4"}, - {KEY_DBL2HAT1+15, "DBLSEC_HATRIGHT4"}, - - - {KEY_3JOY1+0, "TRD_JOY1"}, - {KEY_3JOY1+1, "TRD_JOY2"}, - {KEY_3JOY1+2, "TRD_JOY3"}, - {KEY_3JOY1+3, "TRD_JOY4"}, - {KEY_3JOY1+4, "TRD_JOY5"}, - {KEY_3JOY1+5, "TRD_JOY6"}, - {KEY_3JOY1+6, "TRD_JOY7"}, - {KEY_3JOY1+7, "TRD_JOY8"}, - {KEY_3JOY1+8, "TRD_JOY9"}, - {KEY_3JOY1+9, "TRD_JOY10"}, - {KEY_3JOY1+10, "TRD_JOY11"}, - {KEY_3JOY1+11, "TRD_JOY12"}, - {KEY_3JOY1+12, "TRD_JOY13"}, - {KEY_3JOY1+13, "TRD_JOY14"}, - {KEY_3JOY1+14, "TRD_JOY15"}, - {KEY_3JOY1+15, "TRD_JOY16"}, - {KEY_3JOY1+16, "TRD_JOY17"}, - {KEY_3JOY1+17, "TRD_JOY18"}, - {KEY_3JOY1+18, "TRD_JOY19"}, - {KEY_3JOY1+19, "TRD_JOY20"}, - {KEY_3JOY1+20, "TRD_JOY21"}, - {KEY_3JOY1+21, "TRD_JOY22"}, - {KEY_3JOY1+22, "TRD_JOY23"}, - {KEY_3JOY1+23, "TRD_JOY24"}, - {KEY_3JOY1+24, "TRD_JOY25"}, - {KEY_3JOY1+25, "TRD_JOY26"}, - {KEY_3JOY1+26, "TRD_JOY27"}, - {KEY_3JOY1+27, "TRD_JOY28"}, - {KEY_3JOY1+28, "TRD_JOY29"}, - {KEY_3JOY1+29, "TRD_JOY30"}, - {KEY_3JOY1+30, "TRD_JOY31"}, - {KEY_3JOY1+31, "TRD_JOY32"}, - - {KEY_DBL3JOY1+0, "DBLTRD_JOY1"}, - {KEY_DBL3JOY1+1, "DBLTRD_JOY2"}, - {KEY_DBL3JOY1+2, "DBLTRD_JOY3"}, - {KEY_DBL3JOY1+3, "DBLTRD_JOY4"}, - {KEY_DBL3JOY1+4, "DBLTRD_JOY5"}, - {KEY_DBL3JOY1+5, "DBLTRD_JOY6"}, - {KEY_DBL3JOY1+6, "DBLTRD_JOY7"}, - {KEY_DBL3JOY1+7, "DBLTRD_JOY8"}, - {KEY_DBL3JOY1+8, "DBLTRD_JOY9"}, - {KEY_DBL3JOY1+9, "DBLTRD_JOY10"}, - {KEY_DBL3JOY1+10, "DBLTRD_JOY11"}, - {KEY_DBL3JOY1+11, "DBLTRD_JOY12"}, - {KEY_DBL3JOY1+12, "DBLTRD_JOY13"}, - {KEY_DBL3JOY1+13, "DBLTRD_JOY14"}, - {KEY_DBL3JOY1+14, "DBLTRD_JOY15"}, - {KEY_DBL3JOY1+15, "DBLTRD_JOY16"}, - {KEY_DBL3JOY1+16, "DBLTRD_JOY17"}, - {KEY_DBL3JOY1+17, "DBLTRD_JOY18"}, - {KEY_DBL3JOY1+18, "DBLTRD_JOY19"}, - {KEY_DBL3JOY1+19, "DBLTRD_JOY20"}, - {KEY_DBL3JOY1+20, "DBLTRD_JOY21"}, - {KEY_DBL3JOY1+21, "DBLTRD_JOY22"}, - {KEY_DBL3JOY1+22, "DBLTRD_JOY23"}, - {KEY_DBL3JOY1+23, "DBLTRD_JOY24"}, - {KEY_DBL3JOY1+24, "DBLTRD_JOY25"}, - {KEY_DBL3JOY1+25, "DBLTRD_JOY26"}, - {KEY_DBL3JOY1+26, "DBLTRD_JOY27"}, - {KEY_DBL3JOY1+27, "DBLTRD_JOY28"}, - {KEY_DBL3JOY1+28, "DBLTRD_JOY29"}, - {KEY_DBL3JOY1+29, "DBLTRD_JOY30"}, - {KEY_DBL3JOY1+30, "DBLTRD_JOY31"}, - {KEY_DBL3JOY1+31, "DBLTRD_JOY32"}, - - {KEY_3HAT1+0, "TRD_HATUP"}, - {KEY_3HAT1+1, "TRD_HATDOWN"}, - {KEY_3HAT1+2, "TRD_HATLEFT"}, - {KEY_3HAT1+3, "TRD_HATRIGHT"}, - {KEY_3HAT1+4, "TRD_HATUP2"}, - {KEY_3HAT1+5, "TRD_HATDOWN2"}, - {KEY_3HAT1+6, "TRD_HATLEFT2"}, - {KEY_3HAT1+7, "TRD_HATRIGHT2"}, - {KEY_3HAT1+8, "TRD_HATUP3"}, - {KEY_3HAT1+9, "TRD_HATDOWN3"}, - {KEY_3HAT1+10, "TRD_HATLEFT3"}, - {KEY_3HAT1+11, "TRD_HATRIGHT3"}, - {KEY_3HAT1+12, "TRD_HATUP4"}, - {KEY_3HAT1+13, "TRD_HATDOWN4"}, - {KEY_3HAT1+14, "TRD_HATLEFT4"}, - {KEY_3HAT1+15, "TRD_HATRIGHT4"}, - - {KEY_DBL3HAT1+0, "DBLTRD_HATUP"}, - {KEY_DBL3HAT1+1, "DBLTRD_HATDOWN"}, - {KEY_DBL3HAT1+2, "DBLTRD_HATLEFT"}, - {KEY_DBL3HAT1+3, "DBLTRD_HATRIGHT"}, - {KEY_DBL3HAT1+4, "DBLTRD_HATUP2"}, - {KEY_DBL3HAT1+5, "DBLTRD_HATDOWN2"}, - {KEY_DBL3HAT1+6, "DBLTRD_HATLEFT2"}, - {KEY_DBL3HAT1+7, "DBLTRD_HATRIGHT2"}, - {KEY_DBL3HAT1+8, "DBLTRD_HATUP3"}, - {KEY_DBL3HAT1+9, "DBLTRD_HATDOWN3"}, - {KEY_DBL3HAT1+10, "DBLTRD_HATLEFT3"}, - {KEY_DBL3HAT1+11, "DBLTRD_HATRIGHT3"}, - {KEY_DBL3HAT1+12, "DBLTRD_HATUP4"}, - {KEY_DBL3HAT1+13, "DBLTRD_HATDOWN4"}, - {KEY_DBL3HAT1+14, "DBLTRD_HATLEFT4"}, - {KEY_DBL3HAT1+15, "DBLTRD_HATRIGHT4"}, - - {KEY_4JOY1+0, "FOR_JOY1"}, - {KEY_4JOY1+1, "FOR_JOY2"}, - {KEY_4JOY1+2, "FOR_JOY3"}, - {KEY_4JOY1+3, "FOR_JOY4"}, - {KEY_4JOY1+4, "FOR_JOY5"}, - {KEY_4JOY1+5, "FOR_JOY6"}, - {KEY_4JOY1+6, "FOR_JOY7"}, - {KEY_4JOY1+7, "FOR_JOY8"}, - {KEY_4JOY1+8, "FOR_JOY9"}, - {KEY_4JOY1+9, "FOR_JOY10"}, - {KEY_4JOY1+10, "FOR_JOY11"}, - {KEY_4JOY1+11, "FOR_JOY12"}, - {KEY_4JOY1+12, "FOR_JOY13"}, - {KEY_4JOY1+13, "FOR_JOY14"}, - {KEY_4JOY1+14, "FOR_JOY15"}, - {KEY_4JOY1+15, "FOR_JOY16"}, - {KEY_4JOY1+16, "FOR_JOY17"}, - {KEY_4JOY1+17, "FOR_JOY18"}, - {KEY_4JOY1+18, "FOR_JOY19"}, - {KEY_4JOY1+19, "FOR_JOY20"}, - {KEY_4JOY1+20, "FOR_JOY21"}, - {KEY_4JOY1+21, "FOR_JOY22"}, - {KEY_4JOY1+22, "FOR_JOY23"}, - {KEY_4JOY1+23, "FOR_JOY24"}, - {KEY_4JOY1+24, "FOR_JOY25"}, - {KEY_4JOY1+25, "FOR_JOY26"}, - {KEY_4JOY1+26, "FOR_JOY27"}, - {KEY_4JOY1+27, "FOR_JOY28"}, - {KEY_4JOY1+28, "FOR_JOY29"}, - {KEY_4JOY1+29, "FOR_JOY30"}, - {KEY_4JOY1+30, "FOR_JOY31"}, - {KEY_4JOY1+31, "FOR_JOY32"}, - - {KEY_DBL4JOY1+0, "DBLFOR_JOY1"}, - {KEY_DBL4JOY1+1, "DBLFOR_JOY2"}, - {KEY_DBL4JOY1+2, "DBLFOR_JOY3"}, - {KEY_DBL4JOY1+3, "DBLFOR_JOY4"}, - {KEY_DBL4JOY1+4, "DBLFOR_JOY5"}, - {KEY_DBL4JOY1+5, "DBLFOR_JOY6"}, - {KEY_DBL4JOY1+6, "DBLFOR_JOY7"}, - {KEY_DBL4JOY1+7, "DBLFOR_JOY8"}, - {KEY_DBL4JOY1+8, "DBLFOR_JOY9"}, - {KEY_DBL4JOY1+9, "DBLFOR_JOY10"}, - {KEY_DBL4JOY1+10, "DBLFOR_JOY11"}, - {KEY_DBL4JOY1+11, "DBLFOR_JOY12"}, - {KEY_DBL4JOY1+12, "DBLFOR_JOY13"}, - {KEY_DBL4JOY1+13, "DBLFOR_JOY14"}, - {KEY_DBL4JOY1+14, "DBLFOR_JOY15"}, - {KEY_DBL4JOY1+15, "DBLFOR_JOY16"}, - {KEY_DBL4JOY1+16, "DBLFOR_JOY17"}, - {KEY_DBL4JOY1+17, "DBLFOR_JOY18"}, - {KEY_DBL4JOY1+18, "DBLFOR_JOY19"}, - {KEY_DBL4JOY1+19, "DBLFOR_JOY20"}, - {KEY_DBL4JOY1+20, "DBLFOR_JOY21"}, - {KEY_DBL4JOY1+21, "DBLFOR_JOY22"}, - {KEY_DBL4JOY1+22, "DBLFOR_JOY23"}, - {KEY_DBL4JOY1+23, "DBLFOR_JOY24"}, - {KEY_DBL4JOY1+24, "DBLFOR_JOY25"}, - {KEY_DBL4JOY1+25, "DBLFOR_JOY26"}, - {KEY_DBL4JOY1+26, "DBLFOR_JOY27"}, - {KEY_DBL4JOY1+27, "DBLFOR_JOY28"}, - {KEY_DBL4JOY1+28, "DBLFOR_JOY29"}, - {KEY_DBL4JOY1+29, "DBLFOR_JOY30"}, - {KEY_DBL4JOY1+30, "DBLFOR_JOY31"}, - {KEY_DBL4JOY1+31, "DBLFOR_JOY32"}, - - {KEY_4HAT1+0, "FOR_HATUP"}, - {KEY_4HAT1+1, "FOR_HATDOWN"}, - {KEY_4HAT1+2, "FOR_HATLEFT"}, - {KEY_4HAT1+3, "FOR_HATRIGHT"}, - {KEY_4HAT1+4, "FOR_HATUP2"}, - {KEY_4HAT1+5, "FOR_HATDOWN2"}, - {KEY_4HAT1+6, "FOR_HATLEFT2"}, - {KEY_4HAT1+7, "FOR_HATRIGHT2"}, - {KEY_4HAT1+8, "FOR_HATUP3"}, - {KEY_4HAT1+9, "FOR_HATDOWN3"}, - {KEY_4HAT1+10, "FOR_HATLEFT3"}, - {KEY_4HAT1+11, "FOR_HATRIGHT3"}, - {KEY_4HAT1+12, "FOR_HATUP4"}, - {KEY_4HAT1+13, "FOR_HATDOWN4"}, - {KEY_4HAT1+14, "FOR_HATLEFT4"}, - {KEY_4HAT1+15, "FOR_HATRIGHT4"}, - - {KEY_DBL4HAT1+0, "DBLFOR_HATUP"}, - {KEY_DBL4HAT1+1, "DBLFOR_HATDOWN"}, - {KEY_DBL4HAT1+2, "DBLFOR_HATLEFT"}, - {KEY_DBL4HAT1+3, "DBLFOR_HATRIGHT"}, - {KEY_DBL4HAT1+4, "DBLFOR_HATUP2"}, - {KEY_DBL4HAT1+5, "DBLFOR_HATDOWN2"}, - {KEY_DBL4HAT1+6, "DBLFOR_HATLEFT2"}, - {KEY_DBL4HAT1+7, "DBLFOR_HATRIGHT2"}, - {KEY_DBL4HAT1+8, "DBLFOR_HATUP3"}, - {KEY_DBL4HAT1+9, "DBLFOR_HATDOWN3"}, - {KEY_DBL4HAT1+10, "DBLFOR_HATLEFT3"}, - {KEY_DBL4HAT1+11, "DBLFOR_HATRIGHT3"}, - {KEY_DBL4HAT1+12, "DBLFOR_HATUP4"}, - {KEY_DBL4HAT1+13, "DBLFOR_HATDOWN4"}, - {KEY_DBL4HAT1+14, "DBLFOR_HATLEFT4"}, - {KEY_DBL4HAT1+15, "DBLFOR_HATRIGHT4"}, - + {KEY_AXIS1+0, "AXISX-"}, + {KEY_AXIS1+1, "AXISX+"}, + {KEY_AXIS1+2, "AXISY-"}, + {KEY_AXIS1+3, "AXISY+"}, + {KEY_AXIS1+4, "AXISZ-"}, + {KEY_AXIS1+5, "AXISZ+"}, + {KEY_AXIS1+6, "AXISXRUDDER-"}, + {KEY_AXIS1+7, "AXISXRUDDER+"}, + {KEY_AXIS1+8, "AXISYRUDDER-"}, + {KEY_AXIS1+9, "AXISYRUDDER+"}, + {KEY_AXIS1+10, "AXISZRUDDER-"}, + {KEY_AXIS1+11, "AXISZRUDDER+"}, + {KEY_AXIS1+12, "AXISU-"}, + {KEY_AXIS1+13, "AXISU+"}, + {KEY_AXIS1+14, "AXISV-"}, + {KEY_AXIS1+15, "AXISV+"}, }; static const char *gamecontrolname[num_gamecontrols] = { - "nothing", // a key/button mapped to gc_null has no effect - "aimforward", - "aimbackward", - "turnleft", - "turnright", - "accelerate", - "drift", - "brake", - "spindash", - "fire", - "lookback", - "camreset", - "camtoggle", - "spectate", - "lookup", - "lookdown", - "centerview", - "talkkey", - "teamtalkkey", - "scores", + "null", // a key/button mapped to gc_null has no effect + "up", + "down", + "left", + "right", + "a", + "b", + "c", + "x", + "y", + "z", + "l", + "r", + "start", + "abc", "console", - "pause", - "systemmenu", - "screenshot", - "recordgif", - "viewpoint", - "custom1", - "custom2", - "custom3", }; #define NUMKEYNAMES (sizeof (keynames)/sizeof (keyname_t)) @@ -775,19 +395,24 @@ static const char *gamecontrolname[num_gamecontrols] = // // Detach any keys associated to the given game control // - pass the pointer to the gamecontrol table for the player being edited -void G_ClearControlKeys(INT32 (*setupcontrols)[2], INT32 control) +void G_ClearControlKeys(INT32 (*setupcontrols)[MAXINPUTMAPPING], INT32 control) { - setupcontrols[control][0] = KEY_NULL; - setupcontrols[control][1] = KEY_NULL; + INT32 i; + for (i = 0; i < MAXINPUTMAPPING; i++) + { + setupcontrols[control][i] = KEY_NULL; + } } void G_ClearAllControlKeys(void) { INT32 i, j; - for (i = 0; i < num_gamecontrols; i++) + for (j = 0; j < MAXSPLITSCREENPLAYERS; j++) { - for (j = 0; j < MAXSPLITSCREENPLAYERS; j++) + for (i = 0; i < num_gamecontrols; i++) + { G_ClearControlKeys(gamecontrol[j], i); + } } } @@ -844,121 +469,75 @@ INT32 G_KeyStringtoNum(const char *keystr) void G_DefineDefaultControls(void) { - INT32 i; - + // These defaults are bad & temporary. // Keyboard controls - gamecontroldefault[0][gcs_kart][gc_aimforward ][0] = KEY_UPARROW; - gamecontroldefault[0][gcs_kart][gc_aimbackward][0] = KEY_DOWNARROW; - gamecontroldefault[0][gcs_kart][gc_turnleft ][0] = KEY_LEFTARROW; - gamecontroldefault[0][gcs_kart][gc_turnright ][0] = KEY_RIGHTARROW; - gamecontroldefault[0][gcs_kart][gc_accelerate ][0] = 'a'; - gamecontroldefault[0][gcs_kart][gc_drift ][0] = 's'; - gamecontroldefault[0][gcs_kart][gc_brake ][0] = 'd'; - gamecontroldefault[0][gcs_kart][gc_fire ][0] = KEY_SPACE; - gamecontroldefault[0][gcs_kart][gc_lookback ][0] = KEY_LSHIFT; + gamecontroldefault[gc_up ][0] = KEY_UPARROW; + gamecontroldefault[gc_down ][0] = KEY_DOWNARROW; + gamecontroldefault[gc_left ][0] = KEY_LEFTARROW; + gamecontroldefault[gc_right][0] = KEY_RIGHTARROW; + gamecontroldefault[gc_a ][0] = 'z'; + gamecontroldefault[gc_b ][0] = 'x'; + gamecontroldefault[gc_c ][0] = 'c'; + gamecontroldefault[gc_x ][0] = 'a'; + gamecontroldefault[gc_y ][0] = 's'; + gamecontroldefault[gc_z ][0] = 'd'; + gamecontroldefault[gc_l ][0] = 'q'; + gamecontroldefault[gc_r ][0] = 'e'; + gamecontroldefault[gc_start][0] = 'e'; - gamecontroldefault[0][gcs_kart][gc_pause ][0] = KEY_PAUSE; - gamecontroldefault[0][gcs_kart][gc_console ][0] = KEY_CONSOLE; - gamecontroldefault[0][gcs_kart][gc_screenshot ][0] = KEY_F8; - gamecontroldefault[0][gcs_kart][gc_recordgif ][0] = KEY_F9; - gamecontroldefault[0][gcs_kart][gc_viewpoint ][0] = KEY_F12; - gamecontroldefault[0][gcs_kart][gc_talkkey ][0] = 't'; - //gamecontroldefault[0][gcs_kart][gc_teamkey ][0] = 'y'; - gamecontroldefault[0][gcs_kart][gc_scores ][0] = KEY_TAB; - gamecontroldefault[0][gcs_kart][gc_spectate ][0] = '\''; - gamecontroldefault[0][gcs_kart][gc_lookup ][0] = KEY_PGUP; - gamecontroldefault[0][gcs_kart][gc_lookdown ][0] = KEY_PGDN; - gamecontroldefault[0][gcs_kart][gc_centerview ][0] = KEY_END; - gamecontroldefault[0][gcs_kart][gc_camreset ][0] = KEY_HOME; - gamecontroldefault[0][gcs_kart][gc_camtoggle ][0] = KEY_BACKSPACE; - - for (i = gcs_custom+1; i < num_gamecontrolschemes; i++) // skip gcs_custom - { - // Gamepad controls -- same for all schemes - gamecontroldefault[0][i][gc_accelerate ][1] = KEY_JOY1+0; // A - gamecontroldefault[0][i][gc_lookback ][1] = KEY_JOY1+2; // X - gamecontroldefault[0][i][gc_brake ][1] = KEY_JOY1+1; // B - gamecontroldefault[0][i][gc_fire ][1] = KEY_JOY1+4; // LB - gamecontroldefault[0][i][gc_drift ][1] = KEY_JOY1+5; // RB - - gamecontroldefault[0][i][gc_viewpoint ][1] = KEY_JOY1+3; // Y - gamecontroldefault[0][i][gc_pause ][1] = KEY_JOY1+6; // Back - gamecontroldefault[0][i][gc_systemmenu ][0] = KEY_JOY1+7; // Start - gamecontroldefault[0][i][gc_talkkey ][1] = KEY_HAT1+1; // D-Pad Down - gamecontroldefault[0][i][gc_scores ][1] = KEY_HAT1+0; // D-Pad Up - - gamecontroldefault[1][i][gc_accelerate ][0] = KEY_2JOY1+0; // A - gamecontroldefault[1][i][gc_lookback ][0] = KEY_2JOY1+2; // X - gamecontroldefault[1][i][gc_brake ][0] = KEY_2JOY1+1; // B - gamecontroldefault[1][i][gc_fire ][0] = KEY_2JOY1+4; // LB - gamecontroldefault[1][i][gc_drift ][0] = KEY_2JOY1+5; // RB - - gamecontroldefault[2][i][gc_accelerate ][0] = KEY_3JOY1+0; // A - gamecontroldefault[2][i][gc_lookback ][0] = KEY_3JOY1+2; // X - gamecontroldefault[2][i][gc_brake ][0] = KEY_3JOY1+1; // B - gamecontroldefault[2][i][gc_fire ][0] = KEY_3JOY1+4; // LB - gamecontroldefault[2][i][gc_drift ][0] = KEY_3JOY1+5; // RB - - gamecontroldefault[3][i][gc_accelerate ][0] = KEY_3JOY1+0; // A - gamecontroldefault[3][i][gc_lookback ][0] = KEY_3JOY1+2; // X - gamecontroldefault[3][i][gc_brake ][0] = KEY_3JOY1+1; // B - gamecontroldefault[3][i][gc_fire ][0] = KEY_3JOY1+4; // LB - gamecontroldefault[3][i][gc_drift ][0] = KEY_3JOY1+5; // RB - } + // Gamepad controls + gamecontroldefault[gc_up ][1] = KEY_HAT1+0; // D-Pad Up + gamecontroldefault[gc_down ][1] = KEY_HAT1+1; // D-Pad Down + gamecontroldefault[gc_left ][1] = KEY_HAT1+2; // D-Pad Left + gamecontroldefault[gc_right][1] = KEY_HAT1+3; // D-Pad Right + gamecontroldefault[gc_a ][1] = KEY_JOY1+0; // ?? + gamecontroldefault[gc_b ][1] = KEY_JOY1+1; + gamecontroldefault[gc_c ][1] = KEY_JOY1+2; + gamecontroldefault[gc_x ][1] = KEY_JOY1+3; + gamecontroldefault[gc_y ][1] = KEY_JOY1+6; + gamecontroldefault[gc_z ][1] = KEY_JOY1+8; + gamecontroldefault[gc_l ][1] = KEY_JOY1+4; // LB + gamecontroldefault[gc_r ][1] = KEY_JOY1+5; // RB + gamecontroldefault[gc_start][1] = KEY_JOY1+7; // Start } -INT32 G_GetControlScheme(INT32 (*fromcontrols)[2], const INT32 *gclist, INT32 gclen) +void G_CopyControls(INT32 (*setupcontrols)[MAXINPUTMAPPING], INT32 (*fromcontrols)[MAXINPUTMAPPING], const INT32 *gclist, INT32 gclen) { INT32 i, j, gc; - boolean skipscheme; - - for (i = 1; i < num_gamecontrolschemes; i++) // skip gcs_custom (0) - { - skipscheme = false; - for (j = 0; j < (gclist && gclen ? gclen : num_gamecontrols); j++) - { - gc = (gclist && gclen) ? gclist[j] : j; - if (((fromcontrols[gc][0] && gamecontroldefault[0][i][gc][0]) ? fromcontrols[gc][0] != gamecontroldefault[0][i][gc][0] : true) && - ((fromcontrols[gc][0] && gamecontroldefault[0][i][gc][1]) ? fromcontrols[gc][0] != gamecontroldefault[0][i][gc][1] : true) && - ((fromcontrols[gc][1] && gamecontroldefault[0][i][gc][0]) ? fromcontrols[gc][1] != gamecontroldefault[0][i][gc][0] : true) && - ((fromcontrols[gc][1] && gamecontroldefault[0][i][gc][1]) ? fromcontrols[gc][1] != gamecontroldefault[0][i][gc][1] : true)) - { - skipscheme = true; - break; - } - } - if (!skipscheme) - return i; - } - - return gcs_custom; -} - -void G_CopyControls(INT32 (*setupcontrols)[2], INT32 (*fromcontrols)[2], const INT32 *gclist, INT32 gclen) -{ - INT32 i, gc; for (i = 0; i < (gclist && gclen ? gclen : num_gamecontrols); i++) { gc = (gclist && gclen) ? gclist[i] : i; - setupcontrols[gc][0] = fromcontrols[gc][0]; - setupcontrols[gc][1] = fromcontrols[gc][1]; + + for (j = 0; j < MAXINPUTMAPPING; j++) + { + setupcontrols[gc][j] = fromcontrols[gc][j]; + } } } -void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[2], INT32 (*fromcontrolsb)[2], INT32 (*fromcontrolsc)[2], INT32 (*fromcontrolsd)[2]) +void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[MAXINPUTMAPPING], INT32 (*fromcontrolsb)[MAXINPUTMAPPING], INT32 (*fromcontrolsc)[MAXINPUTMAPPING], INT32 (*fromcontrolsd)[MAXINPUTMAPPING]) { - INT32 i; + INT32 i, j; + // TODO: would be nice to get rid of this code duplication for (i = 1; i < num_gamecontrols; i++) { fprintf(f, "setcontrol \"%s\" \"%s\"", gamecontrolname[i], G_KeynumToString(fromcontrolsa[i][0])); - if (fromcontrolsa[i][1]) - fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrolsa[i][1])); - else - fprintf(f, "\n"); + for (j = 1; j < MAXINPUTMAPPING+1; j++) + { + if (j < MAXINPUTMAPPING && fromcontrolsa[i][j]) + { + fprintf(f, " \"%s\"", G_KeynumToString(fromcontrolsa[i][j])); + } + else + { + fprintf(f, "\n"); + break; + } + } } for (i = 1; i < num_gamecontrols; i++) @@ -966,10 +545,18 @@ void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[2], INT32 (*fromcontrolsb) fprintf(f, "setcontrol2 \"%s\" \"%s\"", gamecontrolname[i], G_KeynumToString(fromcontrolsb[i][0])); - if (fromcontrolsb[i][1]) - fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrolsb[i][1])); - else - fprintf(f, "\n"); + for (j = 1; j < MAXINPUTMAPPING+1; j++) + { + if (j < MAXINPUTMAPPING && fromcontrolsb[i][j]) + { + fprintf(f, " \"%s\"", G_KeynumToString(fromcontrolsb[i][j])); + } + else + { + fprintf(f, "\n"); + break; + } + } } for (i = 1; i < num_gamecontrols; i++) @@ -977,10 +564,18 @@ void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[2], INT32 (*fromcontrolsb) fprintf(f, "setcontrol3 \"%s\" \"%s\"", gamecontrolname[i], G_KeynumToString(fromcontrolsc[i][0])); - if (fromcontrolsc[i][1]) - fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrolsc[i][1])); - else - fprintf(f, "\n"); + for (j = 1; j < MAXINPUTMAPPING+1; j++) + { + if (j < MAXINPUTMAPPING && fromcontrolsc[i][j]) + { + fprintf(f, " \"%s\"", G_KeynumToString(fromcontrolsc[i][j])); + } + else + { + fprintf(f, "\n"); + break; + } + } } for (i = 1; i < num_gamecontrols; i++) @@ -988,10 +583,18 @@ void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[2], INT32 (*fromcontrolsb) fprintf(f, "setcontrol4 \"%s\" \"%s\"", gamecontrolname[i], G_KeynumToString(fromcontrolsd[i][0])); - if (fromcontrolsd[i][1]) - fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrolsd[i][1])); - else - fprintf(f, "\n"); + for (j = 1; j < MAXINPUTMAPPING+1; j++) + { + if (j < MAXINPUTMAPPING && fromcontrolsd[i][j]) + { + fprintf(f, " \"%s\"", G_KeynumToString(fromcontrolsd[i][j])); + } + else + { + fprintf(f, "\n"); + break; + } + } } } @@ -1141,7 +744,7 @@ static INT32 G_FilterKeyByVersion(INT32 numctrl, INT32 keyidx, INT32 player, INT return *keynum1; } -static void setcontrol(INT32 (*gc)[2]) +static void setcontrol(INT32 (*gc)[MAXINPUTMAPPING]) { INT32 numctrl; const char *namectrl; diff --git a/src/g_input.h b/src/g_input.h index 57941d6c1..e976f0e52 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -27,106 +27,65 @@ #define JOYHATS 4 // 4 hats #define JOYAXISSET 4 // 4 Sets of 2 axises +#define MAXINPUTMAPPING 4 + // // mouse and joystick buttons are handled as 'virtual' keys // typedef enum { - KEY_MOUSE1 = NUMKEYS, - KEY_JOY1 = KEY_MOUSE1 + MOUSEBUTTONS, + KEY_JOY1 = NUMKEYS, KEY_HAT1 = KEY_JOY1 + JOYBUTTONS, + KEY_AXIS1 = KEY_HAT1 + JOYHATS*4, - KEY_DBLMOUSE1 =KEY_HAT1 + JOYHATS*4, // double clicks - KEY_DBLJOY1 = KEY_DBLMOUSE1 + MOUSEBUTTONS, - KEY_DBLHAT1 = KEY_DBLJOY1 + JOYBUTTONS, - - KEY_2MOUSE1 = KEY_DBLHAT1 + JOYHATS*4, - KEY_2JOY1 = KEY_2MOUSE1 + MOUSEBUTTONS, - KEY_2HAT1 = KEY_2JOY1 + JOYBUTTONS, - - KEY_DBL2MOUSE1 = KEY_2HAT1 + JOYHATS*4, - KEY_DBL2JOY1 = KEY_DBL2MOUSE1 + MOUSEBUTTONS, - KEY_DBL2HAT1 = KEY_DBL2JOY1 + JOYBUTTONS, - - KEY_3JOY1 = KEY_DBL2HAT1 + JOYHATS*4, - KEY_3HAT1 = KEY_3JOY1 + JOYBUTTONS, - - KEY_DBL3JOY1 = KEY_3HAT1 + JOYHATS*4, - KEY_DBL3HAT1 = KEY_DBL3JOY1 + JOYBUTTONS, - - KEY_4JOY1 = KEY_DBL3HAT1 + JOYHATS*4, - KEY_4HAT1 = KEY_4JOY1 + JOYBUTTONS, - - KEY_DBL4JOY1 = KEY_4HAT1 + JOYHATS*4, - KEY_DBL4HAT1 = KEY_DBL4JOY1 + JOYBUTTONS, - - KEY_MOUSEWHEELUP = KEY_DBL4HAT1 + JOYHATS*4, + KEY_MOUSE1 = KEY_AXIS1 + JOYAXISSET*4, + KEY_MOUSEMOVE = KEY_MOUSE1 + MOUSEBUTTONS, + KEY_MOUSEWHEELUP = KEY_MOUSEMOVE + 4, KEY_MOUSEWHEELDOWN = KEY_MOUSEWHEELUP + 1, - KEY_2MOUSEWHEELUP = KEY_MOUSEWHEELDOWN + 1, - KEY_2MOUSEWHEELDOWN = KEY_2MOUSEWHEELUP + 1, - NUMINPUTS = KEY_2MOUSEWHEELDOWN + 1, + NUMINPUTS = KEY_MOUSEWHEELDOWN + 1, } key_input_e; typedef enum { gc_null = 0, // a key/button mapped to gc_null has no effect - gc_aimforward, - gc_aimbackward, - gc_turnleft, - gc_turnright, - gc_accelerate, - gc_drift, - gc_brake, - gc_spindash, - gc_fire, - gc_lookback, - gc_camreset, - gc_camtoggle, - gc_spectate, - gc_lookup, - gc_lookdown, - gc_centerview, - gc_talkkey, - gc_teamkey, - gc_scores, + + // The actual gamepad + gc_up, + gc_down, + gc_left, + gc_right, + gc_a, + gc_b, + gc_c, + gc_x, + gc_y, + gc_z, + gc_l, + gc_r, + gc_start, + + // special keys + gc_abc, gc_console, - gc_pause, - gc_systemmenu, - gc_screenshot, - gc_recordgif, - gc_viewpoint, - gc_custom1, // Lua scriptable - gc_custom2, // Lua scriptable - gc_custom3, // Lua scriptable + num_gamecontrols } gamecontrols_e; -typedef enum -{ - gcs_custom, - gcs_kart, // Kart doesn't really need this code, like, at all? But I don't feel like removing it. - num_gamecontrolschemes -} gamecontrolschemes_e; - // mouse values are used once extern consvar_t cv_mousesens, cv_mouseysens; extern consvar_t cv_mousesens2, cv_mouseysens2; extern consvar_t cv_controlperkey; -extern INT32 mousex, mousey; -extern INT32 mlooky; //mousey with mlookSensitivity - -extern INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET]; - -// current state of the keys: true if pushed -extern UINT8 gamekeydown[NUMINPUTS]; +// current state of the keys: JOYAXISRANGE or 0 when boolean. +// Or anything inbetween for analog values +extern INT32 gamekeydown[MAXSPLITSCREENPLAYERS][NUMINPUTS]; // two key codes (or virtual key) per game control -extern INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][2]; -extern INT32 gamecontroldefault[MAXSPLITSCREENPLAYERS][num_gamecontrolschemes][num_gamecontrols][2]; // default control storage, use 0 (gcs_custom) for memory retention -#define PlayerInputDown(p, gc) (gamekeydown[gamecontrol[p-1][gc][0]] || gamekeydown[gamecontrol[p-1][gc][1]]) +extern INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][MAXINPUTMAPPING]; +extern INT32 gamecontroldefault[num_gamecontrols][MAXINPUTMAPPING]; // default control storage +/* #define num_gcl_accelerate 1 #define num_gcl_brake 1 #define num_gcl_drift 1 @@ -142,6 +101,7 @@ extern const INT32 gcl_spindash[num_gcl_spindash]; extern const INT32 gcl_movement[num_gcl_movement]; extern const INT32 gcl_item[num_gcl_item]; extern const INT32 gcl_full[num_gcl_full]; +*/ // peace to my little coder fingers! // check a gamecontrol being active or not @@ -154,16 +114,16 @@ const char *G_KeynumToString(INT32 keynum); INT32 G_KeyStringtoNum(const char *keystr); // detach any keys associated to the given game control -void G_ClearControlKeys(INT32 (*setupcontrols)[2], INT32 control); +void G_ClearControlKeys(INT32 (*setupcontrols)[MAXINPUTMAPPING], INT32 control); void G_ClearAllControlKeys(void); void Command_Setcontrol_f(void); void Command_Setcontrol2_f(void); void Command_Setcontrol3_f(void); void Command_Setcontrol4_f(void); void G_DefineDefaultControls(void); -INT32 G_GetControlScheme(INT32 (*fromcontrols)[2], const INT32 *gclist, INT32 gclen); -void G_CopyControls(INT32 (*setupcontrols)[2], INT32 (*fromcontrols)[2], const INT32 *gclist, INT32 gclen); -void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[2], INT32 (*fromcontrolsb)[2], INT32 (*fromcontrolsc)[2], INT32 (*fromcontrolsd)[2]); +INT32 G_GetControlScheme(INT32 (*fromcontrols)[MAXINPUTMAPPING], const INT32 *gclist, INT32 gclen); +void G_CopyControls(INT32 (*setupcontrols)[MAXINPUTMAPPING], INT32 (*fromcontrols)[MAXINPUTMAPPING], const INT32 *gclist, INT32 gclen); +void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[MAXINPUTMAPPING], INT32 (*fromcontrolsb)[MAXINPUTMAPPING], INT32 (*fromcontrolsc)[MAXINPUTMAPPING], INT32 (*fromcontrolsd)[MAXINPUTMAPPING]); INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify); #endif diff --git a/src/hu_stuff.c b/src/hu_stuff.c index a1e5b27c7..71fead721 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -916,10 +916,12 @@ void HU_Ticker(void) hu_tick++; hu_tick &= 7; // currently only to blink chat input cursor + /* if (PlayerInputDown(1, gc_scores)) hu_showscores = !chat_on; else hu_showscores = false; + */ hu_keystrokes = false; } @@ -1112,6 +1114,7 @@ boolean HU_Responder(event_t *ev) if (!chat_on) { // enter chat mode +#if 0 if ((ev->data1 == gamecontrol[0][gc_talkkey][0] || ev->data1 == gamecontrol[0][gc_talkkey][1]) && netgame && !OLD_MUTE) // check for old chat mute, still let the players open the chat incase they want to scroll otherwise. { @@ -1132,6 +1135,7 @@ boolean HU_Responder(event_t *ev) typelines = 1; return true; } +#endif } else // if chat_on { @@ -1147,8 +1151,8 @@ boolean HU_Responder(event_t *ev) // Ignore non-keyboard keys, except when the talk key is bound if (ev->data1 >= KEY_MOUSE1 - && (ev->data1 != gamecontrol[0][gc_talkkey][0] - && ev->data1 != gamecontrol[0][gc_talkkey][1])) + /*&& (ev->data1 != gamecontrol[0][gc_talkkey][0] + && ev->data1 != gamecontrol[0][gc_talkkey][1])*/) return false; c = CON_ShiftChar(c); @@ -1210,9 +1214,9 @@ boolean HU_Responder(event_t *ev) I_UpdateMouseGrab(); } else if (c == KEY_ESCAPE - || ((c == gamecontrol[0][gc_talkkey][0] || c == gamecontrol[0][gc_talkkey][1] + /*|| ((c == gamecontrol[0][gc_talkkey][0] || c == gamecontrol[0][gc_talkkey][1] || c == gamecontrol[0][gc_teamkey][0] || c == gamecontrol[0][gc_teamkey][1]) - && c >= KEY_MOUSE1)) // If it's not a keyboard key, then the chat button is used as a toggle. + && c >= KEY_MOUSE1)*/) // If it's not a keyboard key, then the chat button is used as a toggle. { chat_on = false; c_input = 0; // reset input cursor diff --git a/src/k_menufunc.c b/src/k_menufunc.c index b91276feb..171fc2c49 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -835,9 +835,9 @@ boolean M_Responder(event_t *ev) if (ch == -1) return false; - else if (ch == gamecontrol[0][gc_systemmenu][0] || ch == gamecontrol[0][gc_systemmenu][1]) // allow remappable ESC key - ch = KEY_ESCAPE; - else if ((ch == gamecontrol[0][gc_accelerate][0] || ch == gamecontrol[0][gc_accelerate][1]) && ch >= KEY_MOUSE1) + /*else if (ch == gamecontrol[0][gc_systemmenu][0] || ch == gamecontrol[0][gc_systemmenu][1]) // allow remappable ESC key + ch = KEY_ESCAPE;*/ + else if ((ch == gamecontrol[0][gc_a][0] || ch == gamecontrol[0][gc_a][1]) && ch >= KEY_MOUSE1) ch = KEY_ENTER; // F-Keys @@ -917,7 +917,7 @@ boolean M_Responder(event_t *ev) return false; } - if ((ch == gamecontrol[0][gc_brake][0] || ch == gamecontrol[0][gc_brake][1]) && ch >= KEY_MOUSE1) // do this here, otherwise brake opens the menu mid-game + if ((ch == gamecontrol[0][gc_b][0] || ch == gamecontrol[0][gc_b][1]) && ch >= KEY_MOUSE1) // do this here, otherwise brake opens the menu mid-game ch = KEY_ESCAPE; routine = currentMenu->menuitems[itemOn].itemaction; @@ -961,12 +961,11 @@ boolean M_Responder(event_t *ev) else { // dirty hack: for customising controls, I want only buttons/keys, not moves - if (ev->type == ev_mouse - || ev->type == ev_joystick - || ev->type == ev_joystick2 - || ev->type == ev_joystick3 - || ev->type == ev_joystick4) + if (ev->type == ev_mouse || ev->type == ev_joystick) + { return true; + } + if (routine) { void (*otherroutine)(event_t *sev) = currentMenu->menuitems[itemOn].itemaction; diff --git a/src/m_misc.c b/src/m_misc.c index 32a1efc32..5d048e695 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -624,7 +624,7 @@ void Command_LoadConfig_f(void) for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { - G_CopyControls(gamecontrol[i], gamecontroldefault[i][gcs_kart], NULL, 0); + G_CopyControls(gamecontrol[i], gamecontroldefault, NULL, 0); } // temporarily reset execversion to default @@ -678,7 +678,7 @@ void M_FirstLoadConfig(void) for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { - G_CopyControls(gamecontrol[i], gamecontroldefault[i][gcs_kart], NULL, 0); + G_CopyControls(gamecontrol[i], gamecontroldefault, NULL, 0); } // register execversion here before we load any configs @@ -780,15 +780,7 @@ void M_SaveConfig(const char *filename) if (!dedicated) { - if (tutorialmode && tutorialgcs) - { - // using gcs_custom as temp storage - G_SaveKeySetting(f, gamecontroldefault[0][gcs_custom], gamecontrol[1], gamecontrol[2], gamecontrol[3]); - } - else - { - G_SaveKeySetting(f, gamecontrol[0], gamecontrol[1], gamecontrol[2], gamecontrol[3]); - } + G_SaveKeySetting(f, gamecontrol[0], gamecontrol[1], gamecontrol[2], gamecontrol[3]); } fclose(f); @@ -1771,9 +1763,9 @@ boolean M_ScreenshotResponder(event_t *ev) if (ch >= KEY_MOUSE1 && menuactive) // If it's not a keyboard key, then don't allow it in the menus! return false; - if (ch == KEY_F8 || ch == gamecontrol[0][gc_screenshot][0] || ch == gamecontrol[0][gc_screenshot][1]) // remappable F8 + if (ch == KEY_F8 /*|| ch == gamecontrol[0][gc_screenshot][0] || ch == gamecontrol[0][gc_screenshot][1]*/) // remappable F8 M_ScreenShot(); - else if (ch == KEY_F9 || ch == gamecontrol[0][gc_recordgif][0] || ch == gamecontrol[0][gc_recordgif][1]) // remappable F9 + else if (ch == KEY_F9 /*|| ch == gamecontrol[0][gc_recordgif][0] || ch == gamecontrol[0][gc_recordgif][1]*/) // remappable F9 ((moviemode) ? M_StopMovie : M_StartMovie)(); else return false; diff --git a/src/p_tick.c b/src/p_tick.c index 5e92649cb..1c8a69dd4 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -676,7 +676,7 @@ void P_Ticker(boolean run) G_WriteAllGhostTics(); if (cv_recordmultiplayerdemos.value && (demo.savemode == DSM_NOTSAVING || demo.savemode == DSM_WILLAUTOSAVE)) - if (demo.savebutton && demo.savebutton + 3*TICRATE < leveltime && PlayerInputDown(1, gc_lookback)) + if (demo.savebutton && demo.savebutton + 3*TICRATE < leveltime && G_PlayerInputDown(0, gc_y, false)) demo.savemode = DSM_TITLEENTRY; } else if (demo.playback) // Use Ghost data for consistency checks. diff --git a/src/p_user.c b/src/p_user.c index c58e61b4d..d47718719 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2583,12 +2583,14 @@ void P_InitCameraCmd(void) static ticcmd_t *P_CameraCmd(camera_t *cam) { + /* INT32 forward, axis; //i // these ones used for multiple conditions boolean turnleft, turnright, mouseaiming; boolean invertmouse, lookaxis, usejoystick, kbl; INT32 player_invert; INT32 screen_invert; + */ ticcmd_t *cmd = &cameracmd; (void)cam; @@ -2596,6 +2598,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) if (!demo.playback) return cmd; // empty cmd, no. + /* kbl = democam.keyboardlook; G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver @@ -2640,7 +2643,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) cmd->turning -= (mousex * 8) * (encoremode ? -1 : 1); axis = PlayerJoyAxis(1, AXISMOVE); - if (PlayerInputDown(1, gc_accelerate) || (usejoystick && axis > 0)) + if (PlayerInputDown(1, gc_a) || (usejoystick && axis > 0)) cmd->buttons |= BT_ACCELERATE; axis = PlayerJoyAxis(1, AXISBRAKE); if (PlayerInputDown(1, gc_brake) || (usejoystick && axis > 0)) @@ -2686,8 +2689,6 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) if (PlayerInputDown(1, gc_centerview)) // No need to put a spectator limit on this one though :V cmd->aiming = 0; - mousex = mousey = mlooky = 0; - cmd->forwardmove += (SINT8)forward; if (cmd->forwardmove > MAXPLMOVE) @@ -2701,6 +2702,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) cmd->turning = -KART_FULLTURN; democam.keyboardlook = kbl; + */ return cmd; } diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index fbac5e7a7..ea020afa5 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -1079,7 +1079,7 @@ void I_ShutdownJoystick(UINT8 index) void I_GetJoystickEvents(UINT8 index) { - static event_t event = {0,0,0,0}; + static event_t event = {0,0,0,0,0}; INT32 i = 0; UINT64 joyhats = 0; #if 0 diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index a493b9edf..ad5b3723d 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -526,13 +526,14 @@ static inline void SDLJoyRemap(event_t *event) (void)event; } -static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which) +static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which, UINT8 pid) { // -32768 to 32767 INT32 raxis = axis/32; + if (which == ev_joystick) { - if (Joystick[0].bGamepadStyle) + if (Joystick[pid].bGamepadStyle) { // gamepad control type, on or off, live or die if (raxis < -(JOYAXISRANGE/2)) @@ -544,7 +545,7 @@ static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which) } else { - raxis = JoyInfo[0].scale!=1?((raxis/JoyInfo[0].scale)*JoyInfo[0].scale):raxis; + raxis = JoyInfo[pid].scale!=1?((raxis/JoyInfo[pid].scale)*JoyInfo[pid].scale):raxis; #ifdef SDL_JDEADZONE if (-SDL_JDEADZONE <= raxis && raxis <= SDL_JDEADZONE) @@ -552,69 +553,7 @@ static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which) #endif } } - else if (which == ev_joystick2) - { - if (Joystick[1].bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (raxis < -(JOYAXISRANGE/2)) - raxis = -1; - else if (raxis > (JOYAXISRANGE/2)) - raxis = 1; - else raxis = 0; - } - else - { - raxis = JoyInfo[1].scale!=1?((raxis/JoyInfo[1].scale)*JoyInfo[1].scale):raxis; -#ifdef SDL_JDEADZONE - if (-SDL_JDEADZONE <= raxis && raxis <= SDL_JDEADZONE) - raxis = 0; -#endif - } - } - else if (which == ev_joystick3) - { - if (Joystick[2].bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (raxis < -(JOYAXISRANGE/2)) - raxis = -1; - else if (raxis > (JOYAXISRANGE/2)) - raxis = 1; - else raxis = 0; - } - else - { - raxis = JoyInfo[2].scale!=1?((raxis/JoyInfo[2].scale)*JoyInfo[2].scale):raxis; - -#ifdef SDL_JDEADZONE - if (-SDL_JDEADZONE <= raxis && raxis <= SDL_JDEADZONE) - raxis = 0; -#endif - } - } - else if (which == ev_joystick4) - { - if (Joystick[3].bGamepadStyle) - { - // gamepad control type, on or off, live or die - if (raxis < -(JOYAXISRANGE/2)) - raxis = -1; - else if (raxis > (JOYAXISRANGE/2)) - raxis = 1; - else raxis = 0; - } - else - { - raxis = JoyInfo[3].scale!=1?((raxis/JoyInfo[3].scale)*JoyInfo[3].scale):raxis; - -#ifdef SDL_JDEADZONE - if (-SDL_JDEADZONE <= raxis && raxis <= SDL_JDEADZONE) - raxis = 0; -#endif - } - } return raxis; } @@ -679,7 +618,7 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt) { SDLforceUngrabMouse(); } - memset(gamekeydown, 0, NUMKEYS); // TODO this is a scary memset + memset(gamekeydown, 0, sizeof(gamekeydown)); // TODO this is a scary memset if (MOUSE_MENU) { @@ -692,6 +631,9 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt) static void Impl_HandleKeyboardEvent(SDL_KeyboardEvent evt, Uint32 type) { event_t event; + + event.device = 0; // TODO: properly set a device + if (type == SDL_KEYUP) { event.type = ev_keyup; @@ -773,6 +715,8 @@ static void Impl_HandleMouseButtonEvent(SDL_MouseButtonEvent evt, Uint32 type) /// \todo inputEvent.button.which if (USE_MOUSEINPUT) { + event.device = 0; // TODO: properly set a device + if (type == SDL_MOUSEBUTTONUP) { event.type = ev_keyup; @@ -805,6 +749,8 @@ static void Impl_HandleMouseWheelEvent(SDL_MouseWheelEvent evt) SDL_memset(&event, 0, sizeof(event_t)); + event.device = 0; // TODO: properly set a device + if (evt.y > 0) { event.data1 = KEY_MOUSEWHEELUP; @@ -832,45 +778,46 @@ static void Impl_HandleJoystickAxisEvent(SDL_JoyAxisEvent evt) SDL_JoystickID joyid[MAXSPLITSCREENPLAYERS]; UINT8 i; - // Determine the Joystick IDs for each current open joystick - for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) - joyid[i] = SDL_JoystickInstanceID(JoyInfo[i].dev); - - evt.axis++; + event.device = INT32_MAX; event.data1 = event.data2 = event.data3 = INT32_MAX; - if (evt.which == joyid[0]) + // Determine the Joystick IDs for each current open joystick + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { - event.type = ev_joystick; + joyid[i] = SDL_JoystickInstanceID(JoyInfo[i].dev); + + if (evt.which == joyid[i]) + { + event.device = i; + } } - else if (evt.which == joyid[1]) + + evt.axis++; + + if (event.device == INT32_MAX) { - event.type = ev_joystick2; + return; } - else if (evt.which == joyid[2]) - { - event.type = ev_joystick3; - } - else if (evt.which == joyid[3]) - { - event.type = ev_joystick4; - } - else return; + //axis if (evt.axis > JOYAXISSET*2) + { return; - //vaule + } + + //vaule[sic] if (evt.axis%2) { event.data1 = evt.axis / 2; - event.data2 = SDLJoyAxis(evt.value, event.type); + event.data2 = SDLJoyAxis(evt.value, event.type, event.device); } else { evt.axis--; event.data1 = evt.axis / 2; - event.data3 = SDLJoyAxis(evt.value, event.type); + event.data3 = SDLJoyAxis(evt.value, event.type, event.device); } + D_PostEvent(&event); } @@ -881,30 +828,30 @@ static void Impl_HandleJoystickHatEvent(SDL_JoyHatEvent evt) SDL_JoystickID joyid[MAXSPLITSCREENPLAYERS]; UINT8 i; + event.device = INT32_MAX; + // Determine the Joystick IDs for each current open joystick for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { joyid[i] = SDL_JoystickInstanceID(JoyInfo[i].dev); - if (evt.hat >= JOYHATS) - return; // ignore hats with too high an index + if (evt.which == joyid[i]) + { + event.device = i; + } + } - if (evt.which == joyid[0]) + if (event.device == INT32_MAX) { - event.data1 = KEY_HAT1 + (evt.hat*4); + return; } - else if (evt.which == joyid[1]) + + if (evt.hat >= JOYHATS) { - event.data1 = KEY_2HAT1 + (evt.hat*4); + return; // ignore hats with too high an index } - else if (evt.which == joyid[2]) - { - event.data1 = KEY_3HAT1 + (evt.hat*4); - } - else if (evt.which == joyid[3]) - { - event.data1 = KEY_4HAT1 + (evt.hat*4); - } - else return; + + event.data1 = KEY_HAT1 + (evt.hat*4); // NOTE: UNFINISHED } @@ -916,27 +863,26 @@ static void Impl_HandleJoystickButtonEvent(SDL_JoyButtonEvent evt, Uint32 type) SDL_JoystickID joyid[MAXSPLITSCREENPLAYERS]; UINT8 i; + event.device = INT32_MAX; + // Determine the Joystick IDs for each current open joystick for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { joyid[i] = SDL_JoystickInstanceID(JoyInfo[i].dev); - if (evt.which == joyid[0]) - { - event.data1 = KEY_JOY1; + if (evt.which == joyid[i]) + { + event.device = i; + } } - else if (evt.which == joyid[1]) + + if (event.device == INT32_MAX) { - event.data1 = KEY_2JOY1; + return; } - else if (evt.which == joyid[2]) - { - event.data1 = KEY_3JOY1; - } - else if (evt.which == joyid[3]) - { - event.data1 = KEY_4JOY1; - } - else return; + + event.data1 = KEY_JOY1; + if (type == SDL_JOYBUTTONUP) { event.type = ev_keyup; @@ -945,15 +891,26 @@ static void Impl_HandleJoystickButtonEvent(SDL_JoyButtonEvent evt, Uint32 type) { event.type = ev_keydown; } - else return; + else + { + return; + } + if (evt.button < JOYBUTTONS) { event.data1 += evt.button; } - else return; + else + { + return; + } SDLJoyRemap(&event); - if (event.type != ev_console) D_PostEvent(&event); + + if (event.type != ev_console) + { + D_PostEvent(&event); + } } @@ -1175,7 +1132,10 @@ void I_GetEvent(void) // In order to make wheels act like buttons, we have to set their state to Up. // This is because wheel messages don't have an up/down state. - gamekeydown[KEY_MOUSEWHEELDOWN] = gamekeydown[KEY_MOUSEWHEELUP] = 0; + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + gamekeydown[i][KEY_MOUSEWHEELDOWN] = gamekeydown[i][KEY_MOUSEWHEELUP] = 0; + } } void I_StartupMouse(void) diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c index 2609c3e31..c365237cb 100644 --- a/src/win32/win_sys.c +++ b/src/win32/win_sys.c @@ -393,6 +393,7 @@ void I_OsPolling(void) { MSG msg; HANDLE ci = GetStdHandle(STD_INPUT_HANDLE); + INT32 i; // we need to dispatch messages to the window // so the window procedure can respond to messages and PostEvent() for keys @@ -419,8 +420,8 @@ void I_OsPolling(void) I_GetEvent(); // reset "emulated keys" - gamekeydown[KEY_MOUSEWHEELUP] = 0; - gamekeydown[KEY_MOUSEWHEELDOWN] = 0; + gamekeydown[0][KEY_MOUSEWHEELUP] = 0; + gamekeydown[0][KEY_MOUSEWHEELDOWN] = 0; } // =========================================================================================== diff --git a/src/y_inter.c b/src/y_inter.c index e840565c1..2d472e19e 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -40,7 +40,7 @@ #include "lua_hud.h" #include "m_random.h" // M_RandomKey -#include "g_input.h" // PlayerInputDown +#include "g_input.h" // G_PlayerInputDown #include "k_battle.h" #include "k_pwrlv.h" #include "k_grandprix.h" @@ -619,7 +619,7 @@ void Y_Ticker(void) if (demo.recording) { - if (demo.savemode == DSM_NOTSAVING && PlayerInputDown(1, gc_lookback)) + if (demo.savemode == DSM_NOTSAVING && G_PlayerInputDown(0, gc_y, false)) demo.savemode = DSM_TITLEENTRY; if (demo.savemode == DSM_WILLSAVE || demo.savemode == DSM_WILLAUTOSAVE) @@ -1478,13 +1478,13 @@ void Y_VoteTicker(void) && !voteclient.playerinfo[i].delay && pickedvote == -1 && votes[p] == -1) { - if (PlayerInputDown(i+1, gc_aimforward) || PlayerJoyAxis(i+1, AXISAIM) < 0) + if (G_PlayerInputDown(i, gc_up, false)) { voteclient.playerinfo[i].selection--; pressed = true; } - if ((PlayerInputDown(i+1, gc_aimbackward) || PlayerJoyAxis(i+1, AXISAIM) > 0) && !pressed) + if (G_PlayerInputDown(i, gc_down, false) && pressed == false) { voteclient.playerinfo[i].selection++; pressed = true; @@ -1495,7 +1495,7 @@ void Y_VoteTicker(void) if (voteclient.playerinfo[i].selection > 3) voteclient.playerinfo[i].selection = 0; - if ((PlayerInputDown(i+1, gc_accelerate) || PlayerJoyAxis(i+1, AXISMOVE) > 0) && !pressed) + if (G_PlayerInputDown(i, gc_a, false) && pressed == false) { D_ModifyClientVote(consoleplayer, voteclient.playerinfo[i].selection, i); pressed = true;