internal static double GetAccelerationOutput(Train Train, int CarIndex, int CurveIndex, double Speed)
{
if (CurveIndex < Train.Cars[CarIndex].Specs.AccelerationCurves.Length)
{
double a0 = Train.Cars[CarIndex].Specs.AccelerationCurves[CurveIndex].StageZeroAcceleration;
double s1 = Train.Cars[CarIndex].Specs.AccelerationCurves[CurveIndex].StageOneSpeed;
double a1 = Train.Cars[CarIndex].Specs.AccelerationCurves[CurveIndex].StageOneAcceleration;
double s2 = Train.Cars[CarIndex].Specs.AccelerationCurves[CurveIndex].StageTwoSpeed;
double e2 = Train.Cars[CarIndex].Specs.AccelerationCurves[CurveIndex].StageTwoExponent;
double f = Train.Cars[CarIndex].Specs.AccelerationCurvesMultiplier;
if (Speed <= 0.0)
{
return f * a0;
}
if (Speed < s1)
{
double t = Speed / s1;
return f * (a0 * (1.0 - t) + a1 * t);
}
if (Speed < s2)
{
return f * s1 * a1 / Speed;
}
return f * s1 * a1 * Math.Pow(s2, e2 - 1.0) * Math.Pow(Speed, -e2);
}
return 0.0;
}