internal void Log(string message) { bool debug = TestFlightManagerScenario.Instance.userSettings.debugLog; message = "TestFlightRnDTeam: " + message; TestFlightUtil.Log(message, debug); }
public void SetFlightTime(float flightTime) { if (TestFlightManagerScenario.Instance != null) { TestFlightManagerScenario.Instance.GetPartDataForPart(TestFlightUtil.GetFullPartName(this.part)).AddValue("flightTime", flightTime); } }
private void InitializeParts(Vessel vessel) { Log("TestFlightManager: Initializing parts for vessel " + vessel.GetName()); // Launch time is equal to current UT unless we have already chached this vessel's launch time double launchTime = Planetarium.GetUniversalTime(); if (knownVessels.ContainsKey(vessel.id)) { launchTime = knownVessels[vessel.id]; } foreach (Part part in vessel.parts) { ITestFlightCore core = TestFlightUtil.GetCore(part); if (core != null) { Log("TestFlightManager: Found core. Getting part data"); PartFlightData partData = tfScenario.GetFlightDataForPartName(TestFlightUtil.GetFullPartName(part)); if (partData == null) { Log("TestFlightManager: Unable to find part data. Starting fresh."); core.InitializeFlightData(null); } else { core.InitializeFlightData(partData.GetFlightData()); } } } }
public void UpdatePartConfig() { Log("Updating part config"); enabled = ActiveConfiguration; active = enabled; List <PartModule> testFlightModules = TestFlightUtil.GetAllTestFlightModulesForAlias(this.part, Alias); for (int i = 0; i < testFlightModules.Count; i++) { testFlightModules[i].enabled = enabled; } if (Events == null) { return; } BaseEvent toggleRNDGUIEvent = Events["ToggleRNDGUI"]; if (toggleRNDGUIEvent != null) { toggleRNDGUIEvent.guiActiveEditor = enabled; toggleRNDGUIEvent.guiName = string.Format("R&D {0}", Alias); } }
public override string GetModuleInfo(string configuration, float reliabilityAtTime) { foreach (var configNode in configs) { if (!configNode.HasValue("configuration")) { continue; } var nodeConfiguration = configNode.GetValue("configuration"); if (string.Equals(nodeConfiguration, configuration, StringComparison.InvariantCultureIgnoreCase)) { if (configNode.HasNode("reliabilityCurve")) { var nodeReliability = new FloatCurve(); nodeReliability.Load(configNode.GetNode("reliabilityCurve")); // core is not yet available here float reliabilityMin = TestFlightUtil.FailureRateToReliability(nodeReliability.Evaluate(nodeReliability.minTime), reliabilityAtTime); float reliabilityMax = TestFlightUtil.FailureRateToReliability(nodeReliability.Evaluate(nodeReliability.maxTime), reliabilityAtTime); return($" Reliability at 0 data: <color=#b1cc00ff>{reliabilityMin:P1}</color>\n Reliability at max data: <color=#b1cc00ff>{reliabilityMax:p1}</color>"); } } } return(base.GetModuleInfo(configuration, reliabilityAtTime)); }
internal void Log(string message) { bool debug = TestFlightManagerScenario.Instance.userSettings.debugLog; message = String.Format("TestFlightCore({0}[{1}]): {2}", TestFlightUtil.GetFullPartName(this.part), Configuration, message); TestFlightUtil.Log(message, debug); }
// Get the base or static failure rate public double GetBaseFailureRate() { if (baseFailureRate > 0) { Log("Returning cached failure rate"); return(baseFailureRate); } double totalBFR = 0f; List <ITestFlightReliability> reliabilityModules = TestFlightUtil.GetReliabilityModules(this.part, Alias); if (reliabilityModules == null) { Log("Unable to locate any reliability modules. Using min failure rate"); return(TestFlightUtil.MIN_FAILURE_RATE); } for (int i = 0, reliabilityModulesCount = reliabilityModules.Count; i < reliabilityModulesCount; i++) { ITestFlightReliability rm = reliabilityModules[i]; totalBFR += rm.GetBaseFailureRate(initialFlightData); } Log(String.Format("BFR: {0:F7}, Modifier: {1:F7}", totalBFR, failureRateModifier)); totalBFR = totalBFR * failureRateModifier; totalBFR = Math.Max(totalBFR, TestFlightUtil.MIN_FAILURE_RATE); baseFailureRate = totalBFR; return(baseFailureRate); }
public List <string> GetTestFlightInfo() { List <string> infoStrings = new List <string>(); string partName = Alias; infoStrings.Add("<b>Core</b>"); infoStrings.Add("<b>Active Part</b>: " + partName); float flightData = TestFlightManagerScenario.Instance.GetFlightDataForPartName(partName); if (flightData < 0f) { flightData = 0f; } infoStrings.Add(String.Format("<b>Flight Data</b>: {0:f2}/{1:f2}", flightData, maxData)); List <ITestFlightReliability> reliabilityModules = TestFlightUtil.GetReliabilityModules(this.part, Alias); if (reliabilityModules != null) { for (int i = 0, reliabilityModulesCount = reliabilityModules.Count; i < reliabilityModulesCount; i++) { ITestFlightReliability reliabilityModule = reliabilityModules[i]; infoStrings.AddRange(reliabilityModule.GetTestFlightInfo()); } } return(infoStrings); }
internal void Log(string message) { PartModule pm = this.Module; if (pm == null) { return; } Part part = pm.part; if (part == null) { return; } string meType = "UNKNOWN"; if (EngineType == EngineModuleType.ENGINE) { meType = "ENGINE"; } if (EngineType == EngineModuleType.SOLVERENGINE) { meType = "SOLVERENGINE"; } message = String.Format("TestFlight_EngineModuleWrapper([{0}]): {1}", meType, message); TestFlightUtil.Log(message, part); }
internal void Log(string message) { PartModule pm = this.Module; if (pm == null) { return; } Part part = pm.part; if (part == null) { return; } string meType = "UNKNOWN"; if (EngineType == EngineModuleType.ENGINE) { meType = "ENGINE"; } if (EngineType == EngineModuleType.ENGINEFX) { meType = "ENGINEFX"; } if (EngineType == EngineModuleType.REALENGINE) { meType = "REALENGINE"; } message = String.Format("TestFlight_EngineModuleWrapper({0}[{1}]): {2}", TestFlightUtil.GetFullPartName(part), meType, message); TestFlightUtil.Log(message, part); }
private void InitializeParts(Vessel vessel) { foreach (Part part in vessel.parts) { // Each KSP part can be composed of N virtual parts List <string> cores = TestFlightInterface.GetActiveCores(part); if (cores == null || cores.Count <= 0) { continue; } foreach (string activeCore in cores) { ITestFlightCore core = TestFlightUtil.GetCore(part, activeCore); if (core != null) { if (TestFlightManagerScenario.Instance.SettingsAlwaysMaxData) { core.InitializeFlightData(core.GetMaximumData()); } else { TestFlightPartData partData = tfScenario.GetPartDataForPart(activeCore); if (partData != null) { core.InitializeFlightData(partData.GetFloat("flightData")); } else { core.InitializeFlightData(0f); } } } } } }
void UpdateVesselInMasterStatusDisplay(Vessel vessel) { if (!masterStatus.ContainsKey(vessel.id)) { return; } var allPartsStatus = masterStatus[vessel.id].allPartsStatus; for (var i = 0; i < allPartsStatus.Count; i++) { var status = allPartsStatus[i]; ITestFlightCore core = status.flightCore; // Update the part status status.partStatus = core.GetPartStatus(); status.failures = core.GetActiveFailures(); status.flightData = core.GetFlightData(); double failureRate = core.GetBaseFailureRate(); MomentaryFailureRate momentaryFailureRate = core.GetWorstMomentaryFailureRate(); if (momentaryFailureRate.valid && momentaryFailureRate.failureRate > failureRate) { failureRate = momentaryFailureRate.failureRate; } status.momentaryFailureRate = failureRate; status.mtbfString = core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, 999); status.runningTime = TestFlightUtil.FormatTime(core.GetBurnTime(), TestFlightUtil.TIMEFORMAT.SHORT_IDENTIFIER, false); allPartsStatus[i] = status; } }
public void DrawWindow(int windowID) { if (selectedPart != null) { ITestFlightCore core = TestFlightUtil.GetCore(selectedPart); if (core != null) { GUILayout.Label(selectedPart.partInfo.title, Styles.styleEditorTitle); if (show) { List <string> infoParts = core.GetTestFlightInfo(); GUILayout.BeginVertical(); foreach (string info in infoParts) { GUILayout.Label(info, Styles.styleEditorText); } GUILayout.EndVertical(); } else { GUILayout.Space(2.0f); GUILayout.Label("Middle click to show TestFlight info...", Styles.styleEditorText); } } } }
private void CalculateMaximumData() { if (maxData > 0f) { return; } List <ITestFlightReliability> reliabilityModules = TestFlightUtil.GetReliabilityModules(this.part, Alias); if (reliabilityModules == null) { return; } if (reliabilityModules.Count < 1) { return; } foreach (ITestFlightReliability rm in reliabilityModules) { FloatCurve curve = rm.GetReliabilityCurve(); if (curve != null) { if (curve.maxTime > maxData) { maxData = curve.maxTime; } } } }
public List <string> GetTestFlightInfo() { List <string> infoStrings = new List <string>(); string partName = Alias; infoStrings.Add("<b>Core</b>"); infoStrings.Add("<b>Active Part</b>: " + partName); float flightData = TestFlightManagerScenario.Instance.GetFlightDataForPartName(partName); if (flightData < 0f) { flightData = 0f; } infoStrings.Add(String.Format("<b>Flight Data</b>: {0:f2}/{1:f2}", flightData, maxData)); List <ITestFlightReliability> reliabilityModules = TestFlightUtil.GetReliabilityModules(this.part, Alias); if (reliabilityModules != null) { Log("Getting info from reliability modules"); foreach (ITestFlightReliability reliabilityModule in reliabilityModules) { infoStrings.AddRange(reliabilityModule.GetTestFlightInfo()); } } return(infoStrings); }
private void CalculateMaximumData() { if (maxData > 0f) { return; } List <ITestFlightReliability> reliabilityModules = TestFlightUtil.GetReliabilityModules(this.part, Alias); if (reliabilityModules == null) { return; } if (reliabilityModules.Count < 1) { return; } for (int i = 0, reliabilityModulesCount = reliabilityModules.Count; i < reliabilityModulesCount; i++) { ITestFlightReliability rm = reliabilityModules[i]; FloatCurve curve = rm.GetReliabilityCurve(); if (curve != null) { if (curve.maxTime > maxData) { maxData = curve.maxTime; } } } }
protected override void OnUpdate() { base.OnUpdate(); float partCurrentFlightData; float newFlightData; TestFlightPartData partData = TestFlightUtil.GetPartDataForPart(partName); if (partData == null) { return; } if (Planetarium.GetUniversalTime() - lastUpdate > 1.0f) { partCurrentFlightData = float.Parse(partData.GetValue("flightData")); newFlightData = partCurrentFlightData - lastData; lastData = partCurrentFlightData; lastUpdate = Planetarium.GetUniversalTime(); if (ReadyToComplete()) { flightData = flightData + newFlightData; titleTracker.UpdateContractWindow(GetTitle()); } } }
/// <summary> /// Determines whether the part is considered operating or not. /// </summary> public bool IsPartOperating() { Profiler.BeginSample("IsPartOperating"); IFlightDataRecorder dr = TestFlightUtil.GetDataRecorder(this.part, Alias); Profiler.EndSample(); return(dr != null && dr.IsPartOperating()); }
public override void OnStart(StartState state) { base.OnStart(state); core = TestFlightUtil.GetCore(this.part, Configuration); if (core != null) { Startup(); } }
// Cause a failure to occur, either a random failure or a specific one // If fallbackToRandom is true, then if the specified failure can't be found or can't be triggered, a random failure will be triggered instead // Returns the triggered failure module, or null if none public ITestFlightFailure TriggerFailure() { // We won't trigger a failure if we are already failed if (activeFailure != null) { return(null); } // Failure occurs. Determine which failure module to trigger int totalWeight = 0; int currentWeight = 0; int chosenWeight = 0; List <ITestFlightFailure> failureModules = null; // Get all failure modules on the part // Then filter only the ones that are not disabled List <ITestFlightFailure> allFailureModules = TestFlightUtil.GetFailureModules(this.part); foreach (ITestFlightFailure fm in allFailureModules) { PartModule pm = fm as PartModule; if (!disabledFailures.Contains(pm.moduleName.Trim().ToLowerInvariant())) { if (failureModules == null) { failureModules = new List <ITestFlightFailure>(); } failureModules.Add(fm); } } if (failureModules == null || failureModules.Count == 0) { return(null); } foreach (ITestFlightFailure fm in failureModules) { totalWeight += fm.GetFailureDetails().weight; } chosenWeight = RandomGenerator.Next(1, totalWeight); foreach (ITestFlightFailure fm in failureModules) { currentWeight += fm.GetFailureDetails().weight; if (currentWeight >= chosenWeight) { // Trigger this module's failure PartModule pm = fm as PartModule; if (pm != null) { return(TriggerNamedFailure(pm.moduleName, false)); } } } return(null); }
public void ForceFailure() { string message = "Part has failed after forced failure"; message = String.Format("TestFlightReliability({0}[{1}]): {2}", Configuration, Configuration, message); TestFlightUtil.Log(message, this.part); core.TriggerFailure(); }
// Failure methods public override void DoFailure() { if (!TestFlightEnabled) { return; } Failed = true; float multiplier = 0; ITestFlightCore core = TestFlightUtil.GetCore(this.part, Configuration); if (core != null) { core.ModifyFlightData(duFail, true); string met = KSPUtil.PrintTimeCompact((int)Math.Floor(this.vessel.missionTime), false); if (dynPressurePenalties) { multiplier = pressureCurve.Evaluate((float)(part.dynamicPressurekPa * 1000d)); if (multiplier <= 0f) { multiplier = 1f; } } if (multiplier > float.Epsilon) { FlightLogger.eventLog.Add($"[{met}] {core.Title} failed: Ignition Failure. {(float)(part.dynamicPressurekPa * 1000d)}Pa dynamic pressure cased a {(1f-multiplier) * 100f}% reduction in normal ignition reliability."); } else { FlightLogger.eventLog.Add($"[{met}] {core.Title} failed: Ignition Failure."); } } Log(String.Format("IgnitionFail: Failing {0} engine(s)", engines.Count)); for (int i = 0; i < engines.Count; i++) { EngineHandler engine = engines[i]; if (engine.failEngine) { engine.engine.Shutdown(); if (severity.ToLowerInvariant() == "major") { // For some reason, need to disable GUI as well engine.engine.Events["Activate"].active = false; engine.engine.Events["Shutdown"].active = false; engine.engine.Events["Activate"].guiActive = false; engine.engine.Events["Shutdown"].guiActive = false; } if ((restoreIgnitionCharge) || (this.vessel.situation == Vessel.Situations.PRELAUNCH)) { RestoreIgnitor(); } engines[i].failEngine = false; } } }
/// <summary> /// Determines whether the part is considered operating or not. /// </summary> public bool IsPartOperating() { IFlightDataRecorder dr = TestFlightUtil.GetDataRecorder(this.part, Alias); if (dr == null) { return(false); } return(dr.IsPartOperating()); }
/// <summary> /// Triggers the failure controlled by the failure module /// </summary> public override void DoFailure() { base.DoFailure(); // for each engine change its fuelFlow which will affect thrust foreach (EngineHandler engine in engines) { float jitter = ispMultiplierJitter - ((float)TestFlightUtil.GetCore(this.part, Configuration).RandomGenerator.NextDouble() * (ispMultiplierJitter * 2)); float actualMultiplier = ispMultiplier + jitter; engine.engine.SetFuelIspMult(actualMultiplier); } }
internal void Log(string message) { if (TestFlightManagerScenario.Instance == null) { return; } bool debug = TestFlightManagerScenario.Instance.userSettings.debugLog; message = "TestFlightHUD: " + message; TestFlightUtil.Log(message, debug); }
public override string GetModuleInfo() { if (reliabilityCurve != null) { // core is not yet available here string mtbfMin = TestFlightUtil.FailureRateToMTBFString(GetBaseFailureRate(reliabilityCurve.minTime), TestFlightUtil.MTBFUnits.SECONDS, false, 999); string mtbfMax = TestFlightUtil.FailureRateToMTBFString(GetBaseFailureRate(reliabilityCurve.maxTime), TestFlightUtil.MTBFUnits.SECONDS, false, 999); return(String.Format("MTBF at 0 data: <color=#859900ff>{0}</color>\nMTBF at max data: <color=#859900ff>{1}</color>", mtbfMin, mtbfMax)); } return(base.GetModuleInfo()); }
public void OnEnable() { if (core == null) { core = TestFlightUtil.GetCore(this.part, Configuration); } if (core != null) { Startup(); } }
public override void OnStart(StartState state) { base.OnStart(state); core = TestFlightUtil.GetCore(this.part, Configuration); if (core != null) { Startup(); } // Get the in-game setting for Launch Pad Ignition Failures preLaunchFailures = HighLogic.CurrentGame.Parameters.CustomParams <TestFlightGameSettings>().preLaunchFailures; }
internal void Log(string message) { if (TestFlightManagerScenario.Instance == null) { return; } bool debug = TestFlightManagerScenario.Instance.userSettings.debugLog; message = String.Format("TestFlightCore({0}[{1}]): {2}", Alias, Configuration, message); TestFlightUtil.Log(message, debug); }
public void AddResearchTeam(Part part, string alias, int team) { Log(String.Format("Assign team #{0} to part", team)); if (IsPartBeingResearched(alias)) { return; } ITestFlightCore core = TestFlightUtil.GetCore(part, alias); if (core == null) { return; } if (TestFlightManagerScenario.Instance == null) { return; } if (!TestFlightManagerScenario.Instance.SettingsEnabled) { return; } if (availableTeams == null) { CreateTeams(); } if (team < availableTeams.Count) { float techTransfer = core.GetTechTransfer(); if (techTransfer > 0f) { TestFlightManagerScenario.Instance.AddFlightDataForPartName(alias, techTransfer); } TestFlightRnDTeam template = availableTeams[team]; activeTeams.Add(alias, new TestFlightRnDTeam(template.Points, template.CostFactor)); activeTeams[alias].PartInResearch = alias; activeTeams[alias].MaxData = core.GetMaximumRnDData() + techTransfer; activeTeams[alias].PartRnDCost = core.GetRnDCost(); activeTeams[alias].PartRnDRate = core.GetRnDRate(); activeTeams[alias].ResearchActive = true; Log(String.Format("Team #{0} has been assigned to part {1}", team, alias)); } else { Log(String.Format("Team #{0} is not valid. There are {1} teams.", team, availableTeams.Count)); } Log(String.Format("New active team count is {0}", activeTeams.Count)); }