internal static void ApplyNotch(Train Train, int PowerValue, bool PowerRelative, int BrakeValue, bool BrakeRelative)
{
// determine notch
int p = PowerRelative ? PowerValue + Train.Specs.CurrentPowerNotch.Driver : PowerValue;
if (p < 0)
{
p = 0;
}
else if (p > Train.Specs.MaximumPowerNotch)
{
p = Train.Specs.MaximumPowerNotch;
}
int b = BrakeRelative ? BrakeValue + Train.Specs.CurrentBrakeNotch.Driver : BrakeValue;
if (b < 0)
{
b = 0;
}
else if (b > Train.Specs.MaximumBrakeNotch)
{
b = Train.Specs.MaximumBrakeNotch;
}
// power sound
if (p < Train.Specs.CurrentPowerNotch.Driver)
{
if (p > 0)
{
// down (not min)
Sounds.SoundBuffer buffer = Train.Cars[Train.DriverCar].Sounds.MasterControllerDown.Buffer;
if (buffer != null)
{
OpenBveApi.Math.Vector3 pos = Train.Cars[Train.DriverCar].Sounds.MasterControllerDown.Position;
Sounds.PlaySound(buffer, 1.0, 1.0, pos, Train, Train.DriverCar, false);
}
}
else
{
// min
Sounds.SoundBuffer buffer = Train.Cars[Train.DriverCar].Sounds.MasterControllerMin.Buffer;
if (buffer != null)
{
OpenBveApi.Math.Vector3 pos = Train.Cars[Train.DriverCar].Sounds.MasterControllerMin.Position;
Sounds.PlaySound(buffer, 1.0, 1.0, pos, Train, Train.DriverCar, false);
}
}
}
else if (p > Train.Specs.CurrentPowerNotch.Driver)
{
if (p < Train.Specs.MaximumPowerNotch)
{
// up (not max)
Sounds.SoundBuffer buffer = Train.Cars[Train.DriverCar].Sounds.MasterControllerUp.Buffer;
if (buffer != null)
{
OpenBveApi.Math.Vector3 pos = Train.Cars[Train.DriverCar].Sounds.MasterControllerUp.Position;
Sounds.PlaySound(buffer, 1.0, 1.0, pos, Train, Train.DriverCar, false);
}
}
else
{
// max
Sounds.SoundBuffer buffer = Train.Cars[Train.DriverCar].Sounds.MasterControllerMax.Buffer;
if (buffer != null)
{
OpenBveApi.Math.Vector3 pos = Train.Cars[Train.DriverCar].Sounds.MasterControllerMax.Position;
Sounds.PlaySound(buffer, 1.0, 1.0, pos, Train, Train.DriverCar, false);
}
}
}
// brake sound
if (b < Train.Specs.CurrentBrakeNotch.Driver)
{
// brake release
Sounds.SoundBuffer buffer = Train.Cars[Train.DriverCar].Sounds.Brake.Buffer;
if (buffer != null)
{
OpenBveApi.Math.Vector3 pos = Train.Cars[Train.DriverCar].Sounds.Brake.Position;
Sounds.PlaySound(buffer, 1.0, 1.0, pos, Train, Train.DriverCar, false);
}
if (b > 0)
{
// brake release (not min)
buffer = Train.Cars[Train.DriverCar].Sounds.BrakeHandleRelease.Buffer;
if (buffer != null)
{
OpenBveApi.Math.Vector3 pos = Train.Cars[Train.DriverCar].Sounds.BrakeHandleRelease.Position;
Sounds.PlaySound(buffer, 1.0, 1.0, pos, Train, Train.DriverCar, false);
}
}
else
{
// brake min
buffer = Train.Cars[Train.DriverCar].Sounds.BrakeHandleMin.Buffer;
if (buffer != null)
{
OpenBveApi.Math.Vector3 pos = Train.Cars[Train.DriverCar].Sounds.BrakeHandleMin.Position;
Sounds.PlaySound(buffer, 1.0, 1.0, pos, Train, Train.DriverCar, false);
}
}
}
else if (b > Train.Specs.CurrentBrakeNotch.Driver)
{
// brake
Sounds.SoundBuffer buffer = Train.Cars[Train.DriverCar].Sounds.BrakeHandleApply.Buffer;
if (buffer != null)
{
OpenBveApi.Math.Vector3 pos = Train.Cars[Train.DriverCar].Sounds.BrakeHandleApply.Position;
Sounds.PlaySound(buffer, 1.0, 1.0, pos, Train, Train.DriverCar, false);
}
}
// apply notch
if (Train.Specs.SingleHandle)
{
if (b != 0) p = 0;
}
Train.Specs.CurrentPowerNotch.Driver = p;
Train.Specs.CurrentBrakeNotch.Driver = b;
Game.AddBlackBoxEntry(Game.BlackBoxEventToken.None);
// plugin
if (Train.Plugin != null)
{
Train.Plugin.UpdatePower();
Train.Plugin.UpdateBrake();
}
}