diff --git a/src/g_game.c b/src/g_game.c index bd2aadf73..8773765f6 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1652,7 +1652,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) static INT32 turnheld[MAXSPLITSCREENPLAYERS]; // for accelerative turning static boolean resetdown[MAXSPLITSCREENPLAYERS]; // don't cam reset every frame - static boolean joystickactive[MAXSPLITSCREENPLAYERS]; // don't use accelerometer tilt if we're alrady turning with stick INT32 forward, side, tspeed; @@ -1717,19 +1716,15 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) } G_HandleAxisDeadZone(forplayer, &joystickvector); - if (joystickvector.xaxis != 0) + // tilt control never has deadzone + // if stick input is used gradually cancel out tilt based on stick intensity + if (cv_tiltcontrol[forplayer].value == 1) { - joystickactive[forplayer] = true; - accelerometertilt = 0; - } - - if (cv_tiltcontrol[forplayer].value != 1) - { - accelerometertilt = 0; - } - else if (!joystickactive[forplayer]) - { - accelerometertilt = G_GetGamepadTilt(forplayer); + accelerometertilt = joystickvector.xaxis + + FixedMul( + FRACUNIT-FixedDiv(joystickvector.xaxis, JOYAXISRANGE), + G_GetGamepadTilt(forplayer)*FRACUNIT + )/FRACUNIT; } // For kart, I've turned the aim axis into a digital axis because we only @@ -1750,13 +1745,13 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) } forward = side = 0; - if (joystickactive[forplayer]) + if (cv_tiltcontrol[forplayer].value == 1) { - tspeed = joystickvector.xaxis; + tspeed = accelerometertilt; } else { - tspeed = accelerometertilt; + tspeed = joystickvector.xaxis; } // use two stage accelerative turning @@ -1779,23 +1774,22 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else { turnheld[forplayer] = 0; - joystickactive[forplayer] = false; } cmd->turning = 0; - if (joystickvector.xaxis != 0) - { - cmd->turning -= (tspeed * KART_FULLTURN) / JOYAXISRANGE; - cmd->angle -= (tspeed * KART_FULLTURN) / JOYAXISRANGE; - side += (joystickvector.xaxis * 4) / JOYAXISRANGE; - } - else if (accelerometertilt != 0) + if (cv_tiltcontrol[forplayer].value == 1) { cmd->turning -= (tspeed * KART_FULLTURN) / JOYAXISRANGE; cmd->angle -= (tspeed * KART_FULLTURN) / JOYAXISRANGE; side += (accelerometertilt * 4) / JOYAXISRANGE; } + else if (joystickvector.xaxis != 0) + { + cmd->turning -= (tspeed * KART_FULLTURN) / JOYAXISRANGE; + cmd->angle -= (tspeed * KART_FULLTURN) / JOYAXISRANGE; + side += (joystickvector.xaxis * 4) / JOYAXISRANGE; + } // Specator mouse turning if (spectating) @@ -2000,8 +1994,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { cmd->tilt = INT8_MAX*tilt/FRACUNIT; - if (!joystickactive[forplayer]) - cmd->flags |= TICCMD_USINGTILT; + cmd->flags |= TICCMD_USINGTILT; if (abs(tilt) > MAXGAMEPADTILT) cmd->flags |= TICCMD_EXCESSTILT; } diff --git a/src/g_game.h b/src/g_game.h index 7ef3b66c6..d976277c4 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -144,6 +144,7 @@ typedef enum #define MAXGAMEPADTILT (50*FRACUNIT/100) #define ACCELEROMETERGRAVITY ((fixed_t)(9.80665f * ((float)FRACUNIT))) #define GAMEPADSHAKETHRESHOLD (UINT8_MAX/2) +#define TILTTOSTICKEASE 6 boolean G_GetGamepadCanUseTilt(INT32 p); void G_UpdateGamepadGravity(INT32 p, vector3_t gyro, vector3_t accel); INT32 G_GetGamepadTilt(INT32 p);