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()); } } }
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); }
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")); } } }
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); } }
// 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); } } } } } }
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); } } }
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(); }