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;