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());
                }
            }
        }
Exemple #2
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);
                     }
                 }
             }
         }
     }
 }
 // Sets the existing partData for this part, or adds a new one
 public void SetPartDataForPart(string partName, TestFlightPartData newData)
 {
     if (partData.ContainsKey(partName))
     {
         partData[partName] = newData;
     }
     else
     {
         partData.Add(partName, newData);
     }
 }
        // Get access to a part's data store for further set/get
        public TestFlightPartData GetPartDataForPart(string partName)
        {
            TestFlightPartData returnValue = null;

            if (partData.ContainsKey(partName))
            {
                returnValue = partData[partName];
            }

            return(returnValue);
        }
Exemple #5
0
 public float GetFlightTime()
 {
     if (TestFlightManagerScenario.Instance != null)
     {
         TestFlightPartData partData = TestFlightManagerScenario.Instance.GetPartDataForPart(Alias);
         return(partData.GetFloat("flightTime"));
     }
     else
     {
         return(0f);
     }
 }
 protected void OnContractAccepted(Contract contract)
 {
     if (contract == Root)
     {
         SetState(ParameterState.Incomplete);
         flightData = 0;
         TestFlightPartData partData = TestFlightUtil.GetPartDataForPart(partName);
         if (partData != null)
         {
             lastData = float.Parse(partData.GetValue("flightData"));
         }
     }
 }
Exemple #7
0
        public void OnTreeSpawn(RDController controller)
        {
            if (TestFlightManagerScenario.Instance == null || controller.nodes == null)
            {
                return;
            }
            List <RDNode> nodes = controller.nodes;

            if (this.baseCost == null)
            {
                baseCost = new Dictionary <string, int>();
                for (int i = 0; i < nodes.Count; i++)
                {
                    RDNode node = nodes[i];
                    if (node != null && node.tech != null)
                    {
                        baseCost.Add(nodes[i].tech.techID, nodes[i].tech.scienceCost);
                    }
                }
            }
            for (int n = 0; n < nodes.Count; n++)
            {
                RDNode node = nodes[n];
                if (node != null && node.tech != null && !node.IsResearched && node.tech.partsAssigned != null)
                {
                    float discount             = 0f;
                    List <AvailablePart> parts = node.tech.partsAssigned;
                    for (int p = 0; p < parts.Count; p++)
                    {
                        if (parts[p] != null)
                        {
                            Part prefab = parts[p].partPrefab;
                            TestFlightPartData partData = TestFlightManagerScenario.Instance.GetPartDataForPart(parts[p].name);
                            if (partData != null && prefab != null)
                            {
                                TestFlightCore core       = (TestFlightCore)prefab.Modules.OfType <TestFlightCore>().FirstOrDefault();
                                float          flightData = partData.GetFloat("flightData");
                                if (core != null && flightData > core.startFlightData)
                                {
                                    discount += (int)(((flightData - core.startFlightData) / (core.maxData - core.startFlightData)) * core.scienceDataValue);
                                }
                            }
                        }
                    }
                    if (discount > 0)
                    {
                        node.tech.scienceCost = (int)Math.Max(0, baseCost[node.tech.techID] - discount);
                    }
                }
            }
        }
 // This is a utility method that adds the "flightData" value directly
 public void AddFlightDataForPartName(string partName, float data)
 {
     if (partData.ContainsKey(partName))
     {
         partData[partName].AddValue("flightData", data);
     }
     else
     {
         TestFlightPartData newData = new TestFlightPartData();
         newData.PartName = partName;
         newData.SetValue("flightData", data);
         partData.Add(partName, newData);
     }
 }
Exemple #9
0
 // This is a utility method that sets the "researchData" value directly
 public void SetResearchDataForPartName(string partName, float data)
 {
     if (partData.ContainsKey(partName))
     {
         partData[partName].SetValue("researchData", data.ToString());
     }
     else
     {
         TestFlightPartData newData = new TestFlightPartData();
         newData.PartName = partName;
         newData.SetValue("researchData", data.ToString());
         partData.Add(partName, newData);
     }
 }
        private void InitializeParts(Vessel vessel)
        {
            if (!tfScenario.SettingsEnabled)
            {
                return;
            }

            // Launch time is equal to current UT unless we have already cached this vessel's launch time
            double launchTime = Planetarium.GetUniversalTime();

            if (knownVessels.ContainsKey(vessel.id))
            {
                launchTime = knownVessels[vessel.id];
            }
            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)
                    {
                        Log("TestFlightManager: Found core.  Getting part data");
                        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);
                            }
                        }
                    }
                }
            }
        }
Exemple #11
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 cached 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");
                    if (TestFlightManagerScenario.Instance.SettingsAlwaysMaxData)
                    {
                        core.InitializeFlightData(core.GetMaximumData());
                    }
                    else
                    {
                        TestFlightPartData partData = tfScenario.GetPartDataForPart(TestFlightUtil.GetFullPartName(part));
                        if (partData != null)
                        {
                            core.InitializeFlightData(partData.GetFloat("flightData"));
                        }
                        else
                        {
                            core.InitializeFlightData(0f);
                        }
                    }
                }
            }
        }
        public override void OnLoad(ConfigNode node)
        {
            base.OnLoad(node);
            if (userSettings != null)
            {
                userSettings.Load();
            }
            if (bodySettings != null)
            {
                bodySettings.Load();
            }

            InitDataStore();
            if (node.HasValue("saveData"))
            {
                rawSaveData = node.GetValue("saveData");
            }
            else
            {
                rawSaveData = "";
            }
            decodeRawSaveData();

            if (partData == null)
            {
                partData = new Dictionary <String, TestFlightPartData>();
            }
            else
            {
                partData.Clear();
            }
            // TODO: This old method of storing scope specific data is deprecated and needs to be removed in the next major release (Probably 1.4)
            if (node.HasNode("FLIGHTDATA_PART"))
            {
                foreach (ConfigNode partNode in node.GetNodes("FLIGHTDATA_PART"))
                {
                    PartFlightData partFlightData = new PartFlightData();
                    partFlightData.Load(partNode);

                    // migrates old data into new noscope layout
                    TestFlightPartData storedPartData = new TestFlightPartData();
                    storedPartData.PartName = partFlightData.GetPartName();
                    // Add up all the data and time from the old system for each scope, and then save that as the new migrated vales
                    double totalData = 0;
                    double totalTime = 0;
                    List <TestFlightData> allData = partFlightData.GetFlightData();
                    foreach (TestFlightData data in allData)
                    {
                        totalData += data.flightData;
                        totalTime += data.flightTime;
                    }
                    storedPartData.SetValue("flightData", totalData.ToString());
                    storedPartData.SetValue("flightTime", totalTime.ToString());
                    partData.Add(storedPartData.PartName, storedPartData);
                }
            }
            // new noscope
            if (node.HasNode("partData"))
            {
                foreach (ConfigNode partDataNode in node.GetNodes("partData"))
                {
                    TestFlightPartData storedPartData = new TestFlightPartData();
                    storedPartData.Load(partDataNode);
                    partData.Add(storedPartData.PartName, storedPartData);
                }
            }
        }
 public string SelectPart(string partQuery)
 {
     // Part can be specified directly wth a part name, or through a query expression to dynamically select a part at runtime
     // Lists of parts to choose from can be specified by a comma seperated list
     // the + character prepended means choose the part from the list with the most data
     // the - character prepended means choose the part from the list with the least data
     // the ! character prepended means choose the first part from the list with no data
     // The + and - options can also be used without a list, in which case they mean simply choose the part with the most or least data of all parts
     // If no operator is specified, then a random part from the list is chosen
     if (partQuery.Contains(","))
     {
         // we have a list
         if (partQuery[0] == '+')
         {
             string             newQuery = partQuery.Substring(1);
             float              maxData  = 0f;
             string             maxPart  = "";
             TestFlightPartData partData = null;
             string[]           parts    = newQuery.Split(new char[1] {
                 ','
             });
             foreach (string partName in parts)
             {
                 partData = TestFlightUtil.GetPartDataForPart(partName);
                 if (partData == null)
                 {
                     continue;
                 }
                 float partFlightData = float.Parse(partData.GetValue("flightData"));
                 if (partFlightData > maxData)
                 {
                     maxData = partFlightData;
                     maxPart = partData.PartName;
                 }
             }
             return(maxPart);
         }
         else if (partQuery[0] == '-')
         {
             string             newQuery = partQuery.Substring(1);
             float              minData  = float.MaxValue;
             string             minPart  = "";
             TestFlightPartData partData = null;
             string[]           parts    = newQuery.Split(new char[1] {
                 ','
             });
             foreach (string partName in parts)
             {
                 partData = TestFlightUtil.GetPartDataForPart(partName);
                 if (partData == null)
                 {
                     continue;
                 }
                 float partFlightData = float.Parse(partData.GetValue("flightData"));
                 if (partFlightData < minData)
                 {
                     minData = partFlightData;
                     minPart = partData.PartName;
                 }
             }
             return(minPart);
         }
         else if (partQuery[0] == '!')
         {
             return(TestFlightUtil.PartWithNoData(partQuery.Substring(1)));
         }
         else
         {
             // TODO not yet implemented
             return("");
         }
     }
     else
     {
         // no list, so this is either a direct part name, or a simple +/- operator
         if (partQuery == "+")
         {
             return(TestFlightUtil.PartWithMostData());
         }
         else if (partQuery == "-")
         {
             return(TestFlightUtil.PartWithLeastData());
         }
         else
         {
             TestFlightPartData partData = TestFlightUtil.GetPartDataForPart(partQuery);
             if (partData == null)
             {
                 return("");
             }
             return(partQuery);
         }
     }
 }
Exemple #14
0
        internal override void DrawWindow(int id)
        {
            if (!isReady)
            {
                return;
            }

            if (SelectedPart == null)
            {
                GUILayout.BeginVertical();
                GUILayout.Label("Select a part to display its details", Styles.styleEditorTitle);
                GUILayout.Label("MouseOver part in bin or 3D view to quickview", Styles.styleEditorText);
                GUILayout.Label("RightClick part in bin (not 3D) to toggle window lock on that part", Styles.styleEditorText);
                GUILayout.EndVertical();
                if (DrawToggle(ref tfScenario.userSettings.editorWindowLocked, "Lock Window", Styles.styleToggle))
                {
                    if (tfScenario.userSettings.editorWindowLocked)
                    {
                        CalculateWindowBounds();
                        tfScenario.userSettings.editorWindowPosition = WindowRect;
                        DragEnabled = false;
                    }
                    else
                    {
                        DragEnabled = true;
                    }
                    tfScenario.userSettings.Save();
                }
                return;
            }

            ITestFlightCore core = null;

            GUILayout.BeginVertical();
            GUILayout.Label(String.Format("Selected Part: {0}", TestFlightUtil.GetFullPartName(SelectedPart)), Styles.styleEditorTitle);

            tfScenario.userSettings.currentEditorScrollPosition = GUILayout.BeginScrollView(tfScenario.userSettings.currentEditorScrollPosition);
            TestFlightPartData partData = tfScenario.GetPartDataForPart(TestFlightUtil.GetFullPartName(SelectedPart));

            if (partData != null)
            {
                float flightData = partData.GetFloat("flightData");
                core = TestFlightUtil.GetCore(SelectedPart);
                if (core != null)
                {
                    core.InitializeFlightData(flightData);
                    GUILayout.BeginHorizontal();
                    double failureRate = core.GetBaseFailureRate();
                    String mtbfString  = core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, 999);
                    // 10 characters for body max plus 10 characters for situation plus underscore = 21 characters needed for longest scope string
                    GUILayout.Label(String.Format("{0,-7:F2}<b>du</b>", flightData), GUILayout.Width(75));
                    GUILayout.Label(String.Format("{0,-5:F2} MTBF", mtbfString), GUILayout.Width(125));
                    GUILayout.EndHorizontal();
                }
            }
            GUILayout.EndScrollView();
            if (DrawToggle(ref tfScenario.userSettings.editorWindowLocked, "Lock Window", Styles.styleToggle))
            {
                if (tfScenario.userSettings.editorWindowLocked)
                {
                    CalculateWindowBounds();
                    tfScenario.userSettings.editorWindowPosition = WindowRect;
                    DragEnabled = false;
                }
                else
                {
                    DragEnabled = true;
                }
                tfScenario.userSettings.Save();
            }
            GUILayout.EndVertical();
        }