public static byte CalculateWheelPosXinput(XInputButton button, State state, bool useSto0Z, int stoozPercent, GameProfile gameProfile) { int minVal = 0; int maxVal = 255; switch (gameProfile.EmulationProfile) { case EmulationProfile.SegaInitialD: minVal = 0x1F; maxVal = 0xE1; break; case EmulationProfile.SegaInitialDLindbergh: minVal = 0x1F; maxVal = 0xE1; break; case EmulationProfile.SegaSonicAllStarsRacing: minVal = 0x1D; maxVal = 0xED; break; default: minVal = 0; maxVal = 255; break; } if (button.IsLeftThumbX) { return(useSto0Z ? JvsHelper.CalculateSto0ZWheelPos(state.Gamepad.LeftThumbX, stoozPercent, true) : JvsHelper.CalculateWheelPos(state.Gamepad.LeftThumbX, true, false, minVal, maxVal)); } if (button.IsLeftThumbY) { return(useSto0Z ? JvsHelper.CalculateSto0ZWheelPos(state.Gamepad.LeftThumbY, stoozPercent, true) : JvsHelper.CalculateWheelPos(state.Gamepad.LeftThumbY, true, false, minVal, maxVal)); } if (button.IsRightThumbX) { return(useSto0Z ? JvsHelper.CalculateSto0ZWheelPos(state.Gamepad.RightThumbX, stoozPercent, true) : JvsHelper.CalculateWheelPos(state.Gamepad.RightThumbX, true, false, minVal, maxVal)); } if (button.IsRightThumbY) { return(useSto0Z ? JvsHelper.CalculateSto0ZWheelPos(state.Gamepad.RightThumbY, stoozPercent, true) : JvsHelper.CalculateWheelPos(state.Gamepad.RightThumbY, true, false, minVal, maxVal)); } return(0x7F); }
private byte?ModifyAnalog(JoystickButtons joystickButtons, JoystickUpdate state) { if (joystickButtons.DirectInputButton == null) { return(null); } if ((JoystickOffset)joystickButtons.DirectInputButton.Button != state.Offset) { return(null); } switch (joystickButtons.AnalogType) { case AnalogType.None: break; case AnalogType.AnalogJoystick: { return(JvsHelper.CalculateWheelPos(state.Value)); } case AnalogType.AnalogJoystickReverse: { return((byte)~JvsHelper.CalculateWheelPos(state.Value)); } case AnalogType.Gas: { var gas = HandleGasBrakeForJvs(state.Value, joystickButtons.DirectInputButton?.IsAxisMinus, Lazydata.ParrotData.ReverseAxisGas, Lazydata.ParrotData.FullAxisGas, true); //Console.WriteLine("Gas: " + gas.ToString("X2")); if (InputCode.ButtonMode == EmulationProfile.NamcoWmmt5) { gas /= 3; } return(gas); } break; case AnalogType.Brake: { var brake = HandleGasBrakeForJvs(state.Value, joystickButtons.DirectInputButton?.IsAxisMinus, Lazydata.ParrotData.ReverseAxisGas, Lazydata.ParrotData.FullAxisGas, false); if (InputCode.ButtonMode == EmulationProfile.NamcoWmmt5) { brake /= 3; } //Console.WriteLine("Brake: " + brake.ToString("X2")); return(brake); } break; case AnalogType.Wheel: { int minVal = 0; int maxVal = 255; switch (_gameProfile.EmulationProfile) { case EmulationProfile.SegaInitialD: minVal = 0x1F; maxVal = 0xE1; break; case EmulationProfile.SegaInitialDLindbergh: minVal = 0x1F; maxVal = 0xE1; break; case EmulationProfile.SegaSonicAllStarsRacing: minVal = 0x1D; maxVal = 0xED; break; default: minVal = 0; maxVal = 0xFF; break; } var wheelPos = Lazydata.ParrotData.UseSto0ZDrivingHack ? JvsHelper.CalculateSto0ZWheelPos(state.Value, Lazydata.ParrotData.StoozPercent) : JvsHelper.CalculateWheelPos(state.Value, false, false, minVal, maxVal); if (_gameProfile.EmulationProfile == EmulationProfile.TaitoTypeXBattleGear || _gameProfile.EmulationProfile == EmulationProfile.VirtuaRLimit) { JvsHelper.StateView.Write(4, wheelPos); } return(wheelPos); } case AnalogType.Minimum: if (state.Value == 0x80) { return(0x00); } else { return(0x7F); } case AnalogType.Maximum: if (state.Value == 0x80) { return(0xFF); } else { return(0x7F); } default: throw new ArgumentOutOfRangeException(); } return(null); }