internal void Log(string message)
        {
            bool debug = TestFlightManagerScenario.Instance.userSettings.debugLog;

            message = "TestFlightRnDTeam: " + message;
            TestFlightUtil.Log(message, debug);
        }
예제 #2
0
 public void SetFlightTime(float flightTime)
 {
     if (TestFlightManagerScenario.Instance != null)
     {
         TestFlightManagerScenario.Instance.GetPartDataForPart(TestFlightUtil.GetFullPartName(this.part)).AddValue("flightTime", flightTime);
     }
 }
예제 #3
0
        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());
                    }
                }
            }
        }
예제 #4
0
        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));
        }
예제 #6
0
        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);
        }
예제 #7
0
        // 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);
        }
예제 #8
0
        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);
        }
예제 #9
0
    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);
    }
예제 #10
0
    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);
    }
예제 #11
0
 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);
                     }
                 }
             }
         }
     }
 }
예제 #12
0
        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;
            }
        }
예제 #13
0
 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);
             }
         }
     }
 }
예제 #14
0
        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;
                    }
                }
            }
        }
예제 #15
0
        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);
        }
예제 #16
0
        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());
                }
            }
        }
예제 #18
0
        /// <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();
     }
 }
예제 #20
0
        // 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);
        }
예제 #21
0
        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();
        }
예제 #22
0
        // 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;
                }
            }
        }
예제 #23
0
        /// <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);
     }
 }
예제 #25
0
        internal void Log(string message)
        {
            if (TestFlightManagerScenario.Instance == null)
            {
                return;
            }
            bool debug = TestFlightManagerScenario.Instance.userSettings.debugLog;

            message = "TestFlightHUD: " + message;
            TestFlightUtil.Log(message, debug);
        }
예제 #26
0
 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());
 }
예제 #27
0
 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;
        }
예제 #29
0
        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));
        }