public override void UpdateSolver(EngineThermodynamics ambientTherm, double altitude, Vector3d vel, double mach, bool sIgnited, bool oxygen, bool underwater) { throttledUp = false; // handle ignition if (HighLogic.LoadedSceneIsFlight) { if (vessel.ctrlState.mainThrottle > 0f || throttleLocked) { throttledUp = true; } else { ignited = false; } IgnitionUpdate(); // Ullage bool pressureOK = ullageSet.PressureOK(); propellantStatus = "Nominal"; if (ullage && RFSettings.Instance.simulateUllage) { propellantStatus = ullageSet.GetUllageState(out ullageColor); part.stackIcon.SetIconColor(ullageColor); if (EngineIgnited && ignited && throttledUp && rfSolver.GetRunning()) { double state = ullageSet.GetUllageStability(); double testValue = Math.Pow(state, RFSettings.Instance.stabilityPower); if (UnityEngine.Random.value > testValue) { ScreenMessages.PostScreenMessage(ullageFail); FlightLogger.fetch.LogEvent("[" + FormatTime(vessel.missionTime) + "] " + ullageFail.message); reignitable = false; ullageOK = false; ignited = false; Flameout("Vapor in feed line"); } } } if (!pressureOK) { propellantStatus = "Feed pressure too low"; // override ullage status indicator Flameout("Lack of pressure", false, ignited); ignited = false; reignitable = false; } needSetPropStatus = false; rfSolver.SetPropellantStatus(pressureOK, (ullageOK || !RFSettings.Instance.simulateUllage)); // do thrust curve if (ignited && useThrustCurve) { thrustCurveRatio = (float)((propellants[curveProp].totalResourceAvailable / propellants[curveProp].totalResourceCapacity)); if (thrustCurveUseTime) { thrustCurveDisplay = thrustCurve.Evaluate(curveTime); if (EngineIgnited) { curveTime += TimeWarp.fixedDeltaTime; } } else { thrustCurveDisplay = thrustCurve.Evaluate(thrustCurveRatio); } rfSolver.UpdateThrustRatio(thrustCurveDisplay); } } // Set part temp rfSolver.SetPartTemp(part.temperature); // do heat // heatProduction = (float)(scaleRecip * extHeatkW / PhysicsGlobals.InternalHeatProductionFactor * part.thermalMassReciprocal); heatProduction = 0; // run base method code base.UpdateSolver(ambientTherm, altitude, vel, mach, ignited, oxygen, CheckTransformsUnderwater()); }
public override void UpdateSolver(EngineThermodynamics ambientTherm, double altitude, Vector3d vel, double mach, bool sIgnited, bool oxygen, bool underwater) { UnityEngine.Profiling.Profiler.BeginSample("ModuleEnginesRF.UpdateSolver"); throttledUp = false; // handle ignition if (HighLogic.LoadedSceneIsFlight) { if (vessel.ctrlState.mainThrottle > 0f || throttleLocked) { throttledUp = true; } else { ignited = false; // FIXME handle engine spinning down, non-instant shutoff. } IgnitionUpdate(); // Ullage if (ullage && RFSettings.Instance.simulateUllage) { if (EngineIgnited && ignited && throttledUp && rfSolver.GetRunning()) { double state = ullageSet.GetUllageStability(); double testValue = Math.Pow(state, RFSettings.Instance.stabilityPower); if (UnityEngine.Random.value > testValue) { ScreenMessages.PostScreenMessage(ullageFail); FlightLogger.fetch.LogEvent($"[{FormatTime(vessel.missionTime)}] {ullageFail.message}"); reignitable = false; ullageOK = false; ignited = false; Flameout("Vapor in feed line"); } } } if (!ullageSet.PressureOK()) { Flameout("Lack of pressure", false, ignited); ignited = false; reignitable = false; } rfSolver.SetPropellantStatus(ullageSet.PressureOK(), ullageOK || !RFSettings.Instance.simulateUllage); // do thrust curve if (ignited && useThrustCurve) { thrustCurveRatio = (float)(curveProp.totalResourceAvailable / curveProp.totalResourceCapacity); thrustCurveDisplay = thrustCurve.Evaluate(thrustCurveUseTime ? curveTime : thrustCurveRatio); if (thrustCurveUseTime && EngineIgnited) { curveTime += TimeWarp.fixedDeltaTime; } rfSolver.UpdateThrustRatio(thrustCurveDisplay); } } // Set part temp rfSolver.SetPartTemp(part.temperature); // do heat // heatProduction = (float)(scaleRecip * extHeatkW / PhysicsGlobals.InternalHeatProductionFactor * part.thermalMassReciprocal); heatProduction = 0; // run base method code base.UpdateSolver(ambientTherm, altitude, vel, mach, ignited, oxygen, CheckTransformsUnderwater()); UnityEngine.Profiling.Profiler.EndSample(); }