public void InitFromMSTS(MSTSDieselLocomotive loco) { if ((initLevel & SettingsFlags.IdleRPM) == 0) { IdleRPM = loco.IdleRPM; } if ((initLevel & SettingsFlags.MaxRPM) == 0) { MaxRPM = loco.MaxRPM; } InitialMagnitude = loco.InitialMagnitude; MaxMagnitude = loco.MaxMagnitude; if ((initLevel & SettingsFlags.MaxExhaust) == 0) { MaxExhaust = loco.MaxExhaust; } if ((initLevel & SettingsFlags.ExhaustColor) == 0) { ExhaustSteadyColor = loco.ExhaustSteadyColor; } ExhaustDecelColor = loco.ExhaustDecelColor; if ((initLevel & SettingsFlags.ExhaustTransientColor) == 0) { ExhaustTransientColor = loco.ExhaustTransientColor; } if ((initLevel & SettingsFlags.StartingRPM) == 0) { StartingRPM = loco.IdleRPM * 2.0f / 3.0f; } if ((initLevel & SettingsFlags.StartingConfirmRPM) == 0) { StartingConfirmationRPM = loco.IdleRPM * 1.1f; } if ((initLevel & SettingsFlags.ChangeUpRPMpS) == 0) { ChangeUpRPMpS = loco.MaxRPMChangeRate; } if ((initLevel & SettingsFlags.ChangeDownRPMpS) == 0) { ChangeDownRPMpS = loco.MaxRPMChangeRate; } if ((initLevel & SettingsFlags.RateOfChangeUpRPMpSS) == 0) { RateOfChangeUpRPMpSS = ChangeUpRPMpS; } if ((initLevel & SettingsFlags.RateOfChangeDownRPMpSS) == 0) { RateOfChangeDownRPMpSS = ChangeDownRPMpS; } if ((initLevel & SettingsFlags.MaximalPowerW) == 0) { MaximalPowerW = loco.MaxPowerW; } if ((initLevel & SettingsFlags.MaxOilPressure) == 0) { DieselMaxOilPressurePSI = loco.DieselMaxOilPressurePSI; } if ((initLevel & SettingsFlags.MinOilPressure) == 0) { DieselMinOilPressurePSI = loco.DieselMinOilPressurePSI; } if ((initLevel & SettingsFlags.MaxTemperature) == 0) { DieselMaxTemperatureDeg = loco.DieselMaxTemperatureDeg; } if ((initLevel & SettingsFlags.Cooling) == 0) { EngineCooling = loco.DieselEngineCooling; } if ((initLevel & SettingsFlags.TempTimeConstant) == 0) { DieselTempTimeConstantSec = 720f; } //DieselPowerTab = new Interpolator(new float[] { diesel.IdleRPM, diesel.IdleRPM * 1.01f, diesel.MaxRPM * 0.5f, diesel.MaxRPM }, new float[] { diesel.MaxPowerW * 0.05f, diesel.MaxRPM * 0.1f, diesel.MaxRPM * 0.5f, diesel.MaxPowerW }); //DieselPowerTab = new Interpolator(new float[] { diesel.IdleRPM, diesel.MaxRPM }, new float[] { diesel.MaxPowerW * 0.05f, diesel.MaxPowerW }); if ((initLevel & SettingsFlags.DieselConsumptionTab) == 0) { DieselConsumptionTab = new Interpolator(new float[] { loco.IdleRPM, loco.MaxRPM }, new float[] { loco.DieselUsedPerHourAtIdleL, loco.DieselUsedPerHourAtMaxPowerL }); } if ((initLevel & SettingsFlags.ThrottleRPMTab) == 0) { ThrottleRPMTab = new Interpolator(new float[] { 0, 100 }, new float[] { loco.IdleRPM, loco.MaxRPM }); } if (((initLevel & SettingsFlags.DieselTorqueTab) == 0) && ((initLevel & SettingsFlags.DieselPowerTab) == 0)) { int count = 11; float[] rpm = new float[count + 1]; float[] power = new float[] { 0.02034f, 0.09302f, 0.36628f, 0.60756f, 0.69767f, 0.81395f, 0.93023f, 0.9686f, 0.99418f, 0.99418f, 1f, 0.5f }; float[] torque = new float[] { 0.05f, 0.2f, 0.7f, 0.95f, 1f, 1f, 0.98f, 0.95f, 0.9f, 0.86f, 0.81f, 0.3f }; for (int i = 0; i < count; i++) { if (i == 0) { rpm[i] = loco.IdleRPM; } else { rpm[i] = rpm[i - 1] + (loco.MaxRPM - loco.IdleRPM) / (count - 1); } power[i] *= MaximalPowerW; torque[i] *= MaximalPowerW / (MaxRPM * 2f * 3.1415f / 60f) / 0.81f; } rpm[count] = loco.MaxRPM * 1.5f; DieselPowerTab = new Interpolator(rpm, power); //DieselPowerTab.test("PowerTab", count); DieselTorqueTab = new Interpolator(rpm, torque); //DieselTorqueTab.test("TorqueTab", count); } if (((initLevel & SettingsFlags.DieselTorqueTab) == 0) && ((initLevel & SettingsFlags.DieselPowerTab) == SettingsFlags.DieselPowerTab)) { float[] rpm = new float[DieselPowerTab.GetSize()]; float[] torque = new float[DieselPowerTab.GetSize()]; for (int i = 0; i < DieselPowerTab.GetSize(); i++) { rpm[i] = IdleRPM + (float)i * (MaxRPM - IdleRPM) / (float)DieselPowerTab.GetSize(); torque[i] = DieselPowerTab[rpm[i]] / (rpm[i] * 2f * 3.1415f / 60f); } } if (((initLevel & SettingsFlags.DieselTorqueTab) == SettingsFlags.DieselTorqueTab) && ((initLevel & SettingsFlags.DieselPowerTab) == 0)) { float[] rpm = new float[DieselPowerTab.GetSize()]; float[] power = new float[DieselPowerTab.GetSize()]; for (int i = 0; i < DieselPowerTab.GetSize(); i++) { rpm[i] = IdleRPM + (float)i * (MaxRPM - IdleRPM) / (float)DieselPowerTab.GetSize(); power[i] = DieselPowerTab[rpm[i]] * rpm[i] * 2f * 3.1415f / 60f; } } InitialExhaust = loco.InitialExhaust; MaxExhaust = loco.MaxExhaust; locomotive = loco; }