// add filters for a set of tag-based situations public static void FilterResearchArchive(string[] situations) { // note: cache the controller, because FindObjectOfType is slow as hell RDArchivesController ctrl = (UnityEngine.Object.FindObjectOfType(typeof(RDArchivesController)) as RDArchivesController); if (ctrl != null && ctrl.dropdownListContainer != null && ctrl.dropdownListContainer.lists != null && ctrl.dropdownListContainer.lists.Length >= 3) { foreach (string situation in situations) { // try to get the item KSP.UI.UIListItem item; items.TryGetValue(situation, out item); // if there is no item, or the list was reset if (items == null || !ctrl.dropdownListContainer.lists[1].scrollList.Contains(item)) { // get number of matching reports int count = ResearchAndDevelopment.GetSubjects().FindAll(k => k.id.Contains(situation)).Count; // if there is no report, do nothing if (count == 0) { return; } // create and add it item = ctrl.dropdownListContainer.lists[1].AddItem(situation, situation.AddSpacesOnCaps(), count == 1 ? "1 report" : count + " reports"); items.Remove(situation); items.Add(situation, item); } } } }
private void UpdateScienceSubjects( ) { //var StartTime = DateTime.Now; var SciSubjects = (ResearchAndDevelopment.GetSubjects() ?? new List <ScienceSubject>()); if (_scienceSubjects != null) { for (int i = 0; i < SciSubjects.Count; i++) { var subj = SciSubjects[i]; ScienceSubject subj2; if (_scienceSubjects.TryGetValue(subj.id, out subj2)) { subj2.science = subj.science; subj2.scientificValue = subj.scientificValue; } } } else { _scienceSubjects = SciSubjects.ToDictionary(p => p.id); } //_logger.Trace( "Science Subjects contains " + SciSubjects.Count.ToString( ) + " items" ); //_logger.Trace( "Science Subjects contains " + SciDict.Count.ToString( ) + " items" ); //var Elapsed = DateTime.Now - StartTime; //_logger.Trace( "UpdateScienceSubjects Done - " + Elapsed.ToString( ) + "ms" ); }
internal static List <string> fetchBiome(CelestialBody b, ScienceExperiment exp, ExperimentSituations sit) { List <string> s = new List <string>(); if (b.BiomeMap == null) { s.Add(""); return(s); } else { for (int j = 0; j < b.BiomeMap.Attributes.Length; j++) { string bName = b.BiomeMap.Attributes[j].name; string subId = string.Format("{0}@{1}{2}{3}", exp.id, b.name, sit, bName.Replace(" ", "")); if (ResearchAndDevelopment.GetSubjects().Any(a => a.id == subId)) { ScienceSubject subB = ResearchAndDevelopment.GetSubjectByID(subId); if (subB.scientificValue > 0.5f) { s.Add(bName); } } else { s.Add(bName); } } } return(s); }
private void watcher(float sci, ScienceSubject sub, ProtoVessel v, bool b) { if (sub == null) { return; } if (!sub.id.StartsWith("SEP")) { return; } GameScenes scene = HighLogic.LoadedScene; List <ScienceSubject> subjects = ResearchAndDevelopment.GetSubjects(); if (scene == GameScenes.SPACECENTER || scene == GameScenes.TRACKSTATION) { //SEPUtilities.log("Recovery detected...\nSubject ID - {0}\nScience Recovered - {1:N2}", logLevels.warning, sub.id, sci); SEP_Utilities.checkAndUpdateRelatedSubjects(subjects, sub, sci); } else if (scene == GameScenes.FLIGHT) { //SEPUtilities.log("Transmission detected...\nSubject ID - {0}\nScience Recovered - {1:N2}", logLevels.warning, sub.id, sci); SEP_Utilities.checkAndUpdateRelatedSubjects(subjects, sub, sci); } }
public static ScienceSubject subjectIsValid(SEP_ExperimentHandler handler) { ScienceSubject subject = null; List <ScienceSubject> subjects = ResearchAndDevelopment.GetSubjects(); if (subjects == null || subjects.Count <= 0) { return(null); } for (int i = 1; i <= 3; i++) { ScienceExperiment exp = handler.getExperimentLevel(i); if (exp == null) { continue; } string biome = currentBiome(exp, handler.vessel); string id = string.Format("{0}@{1}{2}{3}", exp.id, handler.vessel.mainBody.name, ExperimentSituations.SrfLanded, biome); if (subjects.Any(s => s.id == id)) { subject = ResearchAndDevelopment.GetSubjectByID(id); //log("Subject ID Confirmed: Science Level - {0:N2}", logLevels.warning, subject.science); } //log("Subject ID Checked: ID {0}", logLevels.warning, id); } return(subject); }
private void UpdateScienceSubjects() { Debug.Log("[XS-GTI] UpdateScienceSubjects() and updateScienceSubjects = " + LoadStatus.ScienceSubjects); if (!LoadStatus.ScienceSubjects || _scienceSubjects.Count == 0) { if (ResearchAndDevelopment.GetSubjects() == null) { Debug.Log("[XS-GTI] ResearchAndDevelopment.GetSubjects() is null"); } if (_scienceSubjects.Count == 0) { Debug.Log("[XS-GTI] _scienceSubjects.Count == 0"); } SciSubjects = (ResearchAndDevelopment.GetSubjects() ?? EmptySubjects); _scienceSubjects = SciSubjects.ToDictionary(p => p.id); LoadStatus.ScienceSubjects = true; } //Original code //var SciSubjects = (ResearchAndDevelopment.GetSubjects() ?? new List<ScienceSubject>()); //Dictionary<string, ScienceSubject> SciDict = SciSubjects.ToDictionary(p => p.id); //_scienceSubjects = SciDict; }
private void OnScienceReceived(float science, ScienceSubject subject, ProtoVessel vessel, bool reverseEngineered) { // If this is set, it means that the vessel recovery dialog is figuring out the science that was received if (reverseEngineered) { return; } Biome biome = Science.GetBiome(subject); if (biome == null || biome.IsKSC()) { return; } IEnumerable<ScienceSubject> subjects = ResearchAndDevelopment.GetSubjects().Where(ss => ss.id.Contains(biome.body.name)); if (explorationType == ExplorationType.Biome) { subjects = subjects.Where(ss => ss.id.Contains(biome.biome)); } float totalScience = subjects.Sum(ss => ss.science) * HighLogic.CurrentGame.Parameters.Career.ScienceGainMultiplier; // The values will be the same if this is the first for the biome if (Math.Abs(totalScience - science) < 0.001) { Funding.Instance.AddFunds(rewardFunds, TransactionReasons.Strategies); string title = "Rewards from strategy '" + Parent.Title + "'"; string header = "Science from new " + ExplorationTypeNamePlural(explorationType) + ":\n"; string rewardMessage = " " + (explorationType == ExplorationType.Biome ? biome.ToString() : biome.body.name) + ": <color=#B4D455>£ " + rewardFunds.ToString("N0") + "</color>\n"; MessageSystem.Message message = MessageSystem.Instance.FindMessages(m => m.messageTitle == title).FirstOrDefault(); if (message == null) { MessageSystem.Instance.AddMessage(new MessageSystem.Message(title, header + rewardMessage, MessageSystemButton.MessageButtonColor.GREEN, MessageSystemButton.ButtonIcons.ACHIEVE)); } else { // Section doesn't exist if (!message.message.Contains(header)) { message.message += "\n" + header; message.message += rewardMessage; } // Section is second (last) else if (message.message.Contains("\n\n" + header)) { message.message += rewardMessage; } // Section is first else { message.message = message.message.Replace("\n\n", "\n" + rewardMessage); } message.IsRead = false; } } }
public List <string> GetKnownExperimentTypes() { List <string> known = new List <string>(); List <ScienceSubject> subjects = ResearchAndDevelopment.GetSubjects(); foreach (ScienceSubject subject in subjects) { string tmpid = subject.id.Split('@')[0]; if (!known.Contains(tmpid)) { known.Add(tmpid); } } known.Sort(); return(known); }
private void UpdateScienceSubjects( ) { // var StartTime = DateTime.Now; var SciSubjects = (ResearchAndDevelopment.GetSubjects( ) ?? new List <ScienceSubject>( )); Dictionary <string, ScienceSubject> SciDict = SciSubjects.ToDictionary(p => p.id); // _logger.Trace( "Science Subjects contains " + SciSubjects.Count.ToString( ) + " items" ); // _logger.Trace( "Science Subjects contains " + SciDict.Count.ToString( ) + " items" ); // var Elapsed = DateTime.Now - StartTime; // _logger.Trace( "GetScienceSubjects Done - " + Elapsed.ToString( ) + "ms" ); _scienceSubjects = SciDict; }
internal static DMCollectScience fetchAnomalyParameter(CelestialBody Body, DMAnomalyObject City) { ExperimentSituations targetSituation; ScienceSubject sub; string anomName; if (Body == null) { return(null); } if (City == null) { return(null); } if (ResearchAndDevelopment.GetExperiment("AnomalyScan") == null) { return(null); } if (rand.Next(0, 2) == 0) { targetSituation = ExperimentSituations.SrfLanded; } else { targetSituation = ExperimentSituations.FlyingLow; } anomName = DMagic.Part_Modules.DMAnomalyScanner.anomalyCleanup(City.Name); string subId = string.Format("AnomalyScan@{0}{1}{2}", Body.bodyName, targetSituation, anomName); if (ResearchAndDevelopment.GetSubjects().Any(s => s.id == subId)) { sub = ResearchAndDevelopment.GetSubjectByID(subId); if (sub.scientificValue < 0.4f) { return(null); } } return(new DMCollectScience(Body, targetSituation, anomName, "Anomaly Scan", 2)); }
void FixScience(float value, ScienceSubject subject, ProtoVessel vessel, bool dataBool) { Debug.Log(value + " science received for " + subject.id + "."); CelestialBody body = FlightGlobals.Bodies.FirstOrDefault(cb => subject.IsFromBody(cb)); if (body != null && scienceCap.ContainsKey(body)) { Debug.Log("body = " + body); // Count past science float pastScience = 0; Debug.Log("counting past science."); foreach (ScienceSubject subj in ResearchAndDevelopment.GetSubjects().Where(s => s.IsFromBody(body))) { pastScience += subj.science; Debug.Log("adding " + subj.science + " science from " + subj.id + "."); } Debug.Log("pastScience = " + pastScience); if (pastScience > scienceCap[body]) { // Calculate excess science float excessScience = pastScience - scienceCap[body]; Debug.Log("excessScience = " + excessScience); // Remove excess science, do not remove more than what has been just added ResearchAndDevelopment.Instance.CheatAddScience(excessScience < value ? -excessScience : -value); Debug.Log("offset science by " + (excessScience < value ? -excessScience : -value)); // Clear all messages foreach (ScreenMessagesText message in ScreenMessages.Instance.gameObject.GetComponentsInChildren <ScreenMessagesText>()) { Destroy(message.gameObject); } // Add new message ScreenMessages.PostScreenMessage(FixMessage(messageText, body), messageDuration); UnityEngine.Debug.Log("<b>[SigmaScienceBalance]<color=#EE0000>[WARNING]</color><color=#FFFFFF>: Reached Science Cap for " + body.name + ". (" + scienceCap[body] + ")</color></b>"); } } }
//Used for initial orbital and surface survey parameter internal static DMCollectScience fetchSurveyScience(Contract.ContractPrestige c, List <CelestialBody> cR, List <CelestialBody> cUR, DMScienceContainer DMScience) { CelestialBody body; ExperimentSituations targetSituation; ScienceSubject sub; string name; string biome = ""; if (!DMUtils.availableScience.ContainsKey("All")) { return(null); } name = DMUtils.availableScience["All"].FirstOrDefault(n => n.Value == DMScience).Key; //Determine if the science part is available if applicable if (DMScience.SciPart != "None") { if (!DMUtils.partAvailable(new List <string>(1) { DMScience.SciPart })) { return(null); } } List <CelestialBody> bodies = new List <CelestialBody>(); Func <CelestialBody, bool> cb = null; switch (c) { case Contract.ContractPrestige.Trivial: cb = delegate(CelestialBody b) { if (b == Planetarium.fetch.Sun) { return(false); } if (b.scienceValues.RecoveryValue > 4) { return(false); } return(true); }; bodies.AddRange(ProgressUtilities.GetBodiesProgress(ProgressType.ORBIT, true, cb)); break; case Contract.ContractPrestige.Significant: cb = delegate(CelestialBody b) { if (b == Planetarium.fetch.Sun) { return(false); } if (b == Planetarium.fetch.Home) { return(false); } if (b.scienceValues.RecoveryValue > 8) { return(false); } return(true); }; bodies.AddRange(ProgressUtilities.GetBodiesProgress(ProgressType.FLYBY, true, cb)); bodies.AddRange(ProgressUtilities.GetNextUnreached(2, cb)); break; case Contract.ContractPrestige.Exceptional: cb = delegate(CelestialBody b) { if (b == Planetarium.fetch.Home) { return(false); } if (Planetarium.fetch.Home.orbitingBodies.Count > 0) { foreach (CelestialBody B in Planetarium.fetch.Home.orbitingBodies) { if (b == B) { return(false); } } } if (b.scienceValues.RecoveryValue < 4) { return(false); } return(true); }; bodies.AddRange(ProgressUtilities.GetBodiesProgress(ProgressType.FLYBY, true, cb)); bodies.AddRange(ProgressUtilities.GetNextUnreached(4, cb)); break; } if (bodies.Count <= 0) { return(null); } body = bodies[rand.Next(0, bodies.Count)]; if (body == null) { return(null); } //Make sure our experiment is OK if (DMScience.Exp == null) { return(null); } if (!body.atmosphere && DMScience.Exp.requireAtmosphere) { return(null); } if (((ExperimentSituations)DMScience.Exp.situationMask & ExperimentSituations.InSpaceHigh) == ExperimentSituations.InSpaceHigh && ((ExperimentSituations)DMScience.Exp.situationMask & ExperimentSituations.InSpaceLow) == ExperimentSituations.InSpaceLow) { if (rand.Next(0, 2) == 0) { targetSituation = ExperimentSituations.InSpaceHigh; } else { targetSituation = ExperimentSituations.InSpaceLow; } } else if (((ExperimentSituations)DMScience.Exp.situationMask & ExperimentSituations.InSpaceHigh) == ExperimentSituations.InSpaceHigh) { targetSituation = ExperimentSituations.InSpaceHigh; } else { targetSituation = ExperimentSituations.InSpaceLow; } if (DMUtils.biomeRelevant(targetSituation, (int)DMScience.Exp.biomeMask) && targetSituation != ExperimentSituations.SrfSplashed) { List <string> bList = DMUtils.fetchBiome(body, DMScience.Exp, targetSituation); if (bList.Count == 0) { return(null); } else { biome = bList[rand.Next(0, bList.Count)]; } } //Make sure that our chosen science subject has science remaining to be gathered string subId = string.Format("{0}@{1}{2}{3}", DMScience.Exp.id, body.bodyName, targetSituation, biome.Replace(" ", "")); if (ResearchAndDevelopment.GetSubjects().Any(s => s.id == subId)) { sub = ResearchAndDevelopment.GetSubjectByID(subId); if (sub.scientificValue < 0.5f) { return(null); } } return(new DMCollectScience(body, targetSituation, "", name, 0)); }
public void GetSciData() { if (ResearchAndDevelopment.Instance == null) { return; } dataOutputList = new List <Experiment>(); List <ScienceSubject> newExperiments = new List <ScienceSubject>(); List <string> exIds = ResearchAndDevelopment.GetExperimentIDs(); List <ScienceSubject> subjectslist = ResearchAndDevelopment.GetSubjects(); //I am glad this code runs only once! Too expensive! foreach (string id in exIds) { foreach (ExperimentSituations experimentSituation in Enum.GetValues(typeof(ExperimentSituations))) { foreach (CelestialBody body in FlightGlobals.Bodies) { bool ocean = body.ocean; if (ExperimentSituations.SrfSplashed == experimentSituation && !ocean) { continue; } if ((ExperimentSituations.FlyingHigh == experimentSituation || ExperimentSituations.FlyingLow == experimentSituation) && !body.atmosphere) { continue; } ScienceExperiment experiment = ResearchAndDevelopment.GetExperiment(id); bool available = experiment.IsAvailableWhile(experimentSituation, body); if (available) { bool shouldHaveBiome = experiment.BiomeIsRelevantWhile(experimentSituation); if (shouldHaveBiome) { foreach (string biome in ResearchAndDevelopment.GetBiomeTags(body)) { if (KSPScienceSettings.getBoolSetting("ShowOnlyKnownBiomes")) { bool foundBiome = subjectslist.Any(subject => subject.id.Contains("@" + body.name) && subject.id.Contains(biome.Replace(" ", ""))); if (!foundBiome) { continue; } } ScienceSubject ssj = new ScienceSubject(experiment, experimentSituation, body, biome); if (id == "asteroidSample") { ssj.scienceCap = experiment.scienceCap; } newExperiments.Add(ssj); } if (body.BiomeMap == null || body.BiomeMap.Attributes.Length == 0) { ScienceSubject ssj = new ScienceSubject(experiment, experimentSituation, body, ""); if (id == "asteroidSample") { ssj.scienceCap = experiment.scienceCap; } newExperiments.Add(ssj); } } else { ScienceSubject ssj = new ScienceSubject(experiment, experimentSituation, body, ""); if (id == "asteroidSample") { ssj.scienceCap = experiment.scienceCap; } newExperiments.Add(ssj); } } } } } foreach (ScienceSubject scienceSubject in subjectslist) { newExperiments.RemoveAll(subject => subject.id == scienceSubject.id); string title = scienceSubject.id; double earned = Math.Round(scienceSubject.science, 1); double remain = Math.Round(scienceSubject.scienceCap - scienceSubject.science, 1); string body = LibraryUtils.FindExperimentBody(scienceSubject.id.Split('@')[1]); string type = scienceSubject.id.Split('@')[0]; Experiment experiment = new Experiment(title, earned, remain, body, type); dataOutputList.Add(experiment); } foreach (ScienceSubject newExperiment in newExperiments) { newExperiment.scientificValue = 1f; CelestialBody thisBody = FlightGlobals.Bodies.Find(celestialBody => newExperiment.id.Split('@')[1].StartsWith(celestialBody.name)); Experiment ex = new Experiment(newExperiment.id, 0, Math.Round(newExperiment.scienceCap, 1), thisBody.name, newExperiment.id.Split('@')[0]); dataOutputList.Add(ex); } dataOutputList.Sort(SortByName); if (KSPScienceSettings.getBoolSetting("ShowOnlyKnownExperiments")) { allExperimentTypes = GetKnownExperimentTypes(); } else { allExperimentTypes = GetAllExperimentTypes(); } }
public static void Load(ConfigNode node) { // RnD subjects don't exists in sandbox if (!Science.GameHasRnD) { return; } // load uncredited science (transmission buffer) uncreditedScience = Lib.ConfigValue(node, "uncreditedScience", 0.0); // Rebuild the list of persisted subjects persistedSubjects.Clear(); foreach (ExperimentInfo expInfo in experiments.Values) { foreach (SubjectData subjectData in subjectByExpThenSituationId[expInfo].Values) { subjectData.CheckRnD(); subjectData.ClearDataCollectedInFlight(); } } // load science subjects persisted data if (node.HasNode("subjectData")) { foreach (var subjectNode in node.GetNode("subjectData").GetNodes()) { string integerSubjectId = DB.From_safe_key(subjectNode.name); SubjectData subjectData = GetSubjectData(integerSubjectId); if (subjectData != null) { subjectData.Load(subjectNode); } } } if (ResearchAndDevelopment.Instance == null) { Lib.Log("ERROR : ResearchAndDevelopment.Instance is null on subjects load !"); } // remove unknown subjects from the database foreach (SubjectData subjectData in unknownSubjectDatas.Values) { int bodyIndex; int scienceSituation; int biomeIndex; Situation.IdToFields(subjectData.Situation.Id, out bodyIndex, out scienceSituation, out biomeIndex); expBodiesSituationsBiomesSubject.RemoveSubject(subjectData.ExpInfo, bodyIndex, (ScienceSituation)scienceSituation, biomeIndex, subjectData); bodiesSituationsBiomesSubjects.RemoveSubject(bodyIndex, (ScienceSituation)scienceSituation, biomeIndex, subjectData); } // clear the list unknownSubjectDatas.Clear(); // find them again foreach (ScienceSubject stockSubject in ResearchAndDevelopment.GetSubjects()) { if (!knownStockSubjectsId.Contains(stockSubject.id)) { GetSubjectDataFromStockId(stockSubject.id, stockSubject); } } }
//Used for initial orbital and surface survey parameter internal static DMCollectScience fetchSurveyScience(Contract.ContractPrestige c, List <CelestialBody> cR, List <CelestialBody> cUR, DMScienceContainer DMScience) { CelestialBody body; ExperimentSituations targetSituation; ScienceSubject sub; AvailablePart aPart; string name; string biome = ""; name = DMUtils.availableScience["All"].FirstOrDefault(n => n.Value == DMScience).Key; //Determine if the science part is available if applicable if (DMScience.SciPart != "None") { aPart = PartLoader.getPartInfoByName(DMScience.SciPart); if (aPart == null) { return(null); } if (!ResearchAndDevelopment.PartModelPurchased(aPart)) { return(null); } } body = DMUtils.nextTargetBody(c, cR, cUR); if (body == null) { return(null); } //Make sure our experiment is OK if (DMScience.Exp == null) { return(null); } if (!body.atmosphere && DMScience.Exp.requireAtmosphere) { return(null); } if (((ExperimentSituations)DMScience.SitMask & ExperimentSituations.InSpaceHigh) == ExperimentSituations.InSpaceHigh && ((ExperimentSituations)DMScience.SitMask & ExperimentSituations.InSpaceLow) == ExperimentSituations.InSpaceLow) { if (rand.Next(0, 2) == 0) { targetSituation = ExperimentSituations.InSpaceHigh; } else { targetSituation = ExperimentSituations.InSpaceLow; } } else if (((ExperimentSituations)DMScience.SitMask & ExperimentSituations.InSpaceHigh) == ExperimentSituations.InSpaceHigh) { targetSituation = ExperimentSituations.InSpaceHigh; } else { targetSituation = ExperimentSituations.InSpaceLow; } if (DMUtils.biomeRelevant(targetSituation, DMScience.BioMask) && targetSituation != ExperimentSituations.SrfSplashed) { List <string> bList = DMUtils.fetchBiome(body, DMScience.Exp, targetSituation); if (bList.Count == 0) { return(null); } else { biome = bList[rand.Next(0, bList.Count)]; } } //Make sure that our chosen science subject has science remaining to be gathered string subId = string.Format("{0}@{1}{2}{3}", DMScience.Exp.id, body.name, targetSituation, biome.Replace(" ", "")); if (ResearchAndDevelopment.GetSubjects().Any(s => s.id == subId)) { sub = ResearchAndDevelopment.GetSubjectByID(subId); if (sub.scientificValue < 0.5f) { return(null); } } return(new DMCollectScience(body, targetSituation, "", name, 0)); }
public static void Load(ConfigNode node) { // RnD subjects don't exists in sandbox if (!Science.GameHasRnD) { // load sandbox science subjects sandboxSubjects.Clear(); if (node.HasNode("sandboxScienceSubjects")) { foreach (var subjectNode in node.GetNode("sandboxScienceSubjects").GetNodes()) { ScienceSubject subject = new ScienceSubject(subjectNode); sandboxSubjects.Add(subject.id, subject); } } } else { // Load API subjects (require RnD) subjectsReceivedBuffer.Clear(); subjectsReceivedValueBuffer.Clear(); ConfigNode APISubjects = new ConfigNode(); if (node.TryGetNode("APISubjects", ref APISubjects)) { foreach (ConfigNode subjectNode in APISubjects.GetNodes("Subject")) { string subjectId = Lib.ConfigValue(subjectNode, "subjectId", string.Empty); ScienceSubject subject = ResearchAndDevelopment.GetSubjectByID(subjectId); if (subject == null) { Lib.Log($"Warning : API subject '{subjectId}' not found in ResearchAndDevelopment"); continue; } subjectsReceivedBuffer.Add(subject); subjectsReceivedValueBuffer.Add(Lib.ConfigValue(subjectNode, "science", 0.0)); } } } // load uncredited science (transmission buffer) uncreditedScience = Lib.ConfigValue(node, "uncreditedScience", 0.0); // Rebuild the list of persisted subjects persistedSubjects.Clear(); foreach (ExperimentInfo expInfo in experiments.Values) { foreach (SubjectData subjectData in subjectByExpThenSituationId[expInfo].Values) { subjectData.CheckRnD(); subjectData.ClearDataCollectedInFlight(); } } // load science subjects persisted data if (node.HasNode("subjectData")) { foreach (var subjectNode in node.GetNode("subjectData").GetNodes()) { string integerSubjectId = DB.From_safe_key(subjectNode.name); SubjectData subjectData = GetSubjectData(integerSubjectId); if (subjectData != null) { subjectData.Load(subjectNode); } } } //if (ResearchAndDevelopment.Instance == null) // Lib.Log("ERROR : ResearchAndDevelopment.Instance is null on subjects load !"); // remove unknown subjects from the database foreach (SubjectData subjectData in unknownSubjectDatas.Values) { int bodyIndex; int scienceSituation; int biomeIndex; Situation.IdToFields(subjectData.Situation.Id, out bodyIndex, out scienceSituation, out biomeIndex); expBodiesSituationsBiomesSubject.RemoveSubject(subjectData.ExpInfo, bodyIndex, (ScienceSituation)scienceSituation, biomeIndex, subjectData); } // clear the list unknownSubjectDatas.Clear(); // find them again IEnumerable <ScienceSubject> stockSubjects; if (Science.GameHasRnD) { stockSubjects = ResearchAndDevelopment.GetSubjects(); } else { stockSubjects = sandboxSubjects.Values; } foreach (ScienceSubject stockSubject in stockSubjects) { if (!knownStockSubjectsId.Contains(stockSubject.id)) { GetSubjectDataFromStockId(stockSubject.id, stockSubject); } } }
//Used for orbital survey internal static DMCollectScience fetchSurveyScience(CelestialBody Body, DMScienceContainer DMScience) { ExperimentSituations targetSituation; ScienceSubject sub; string name; if (!DMUtils.availableScience.ContainsKey("All")) { return(null); } name = DMUtils.availableScience["All"].FirstOrDefault(n => n.Value == DMScience).Key; //Determine if the science part is available if applicable if (DMScience.SciPart != "None") { if (!DMUtils.partAvailable(new List <string>(1) { DMScience.SciPart })) { return(null); } } //Make sure our experiment is OK if (DMScience.Exp == null) { return(null); } if (!Body.atmosphere && DMScience.Exp.requireAtmosphere) { return(null); } if (((ExperimentSituations)DMScience.Exp.situationMask & ExperimentSituations.InSpaceHigh) == ExperimentSituations.InSpaceHigh && ((ExperimentSituations)DMScience.Exp.situationMask & ExperimentSituations.InSpaceLow) == ExperimentSituations.InSpaceLow) { if (rand.Next(0, 2) == 0) { targetSituation = ExperimentSituations.InSpaceHigh; } else { targetSituation = ExperimentSituations.InSpaceLow; } } else if (((ExperimentSituations)DMScience.Exp.situationMask & ExperimentSituations.InSpaceHigh) == ExperimentSituations.InSpaceHigh) { targetSituation = ExperimentSituations.InSpaceHigh; } else { targetSituation = ExperimentSituations.InSpaceLow; } if (DMUtils.biomeRelevant(targetSituation, (int)DMScience.Exp.biomeMask)) { List <string> bList = DMUtils.fetchBiome(Body, DMScience.Exp, targetSituation); if (bList.Count == 0) { return(null); } } else { string subId = string.Format("{0}@{1}{2}", DMScience.Exp.id, Body.bodyName, targetSituation); if (ResearchAndDevelopment.GetSubjects().Any(s => s.id == subId)) { sub = ResearchAndDevelopment.GetSubjectByID(subId); if (sub.scientificValue < 0.5f) { return(null); } } } return(new DMCollectScience(Body, targetSituation, "", name, 0)); }
/// <summary> /// Gets the science subject for the given values. /// </summary> /// <param name="experiment">The science experiment</param> /// <param name="situation">The experimental situation</param> /// <param name="body">The celestial body</param> /// <param name="biome">The biome</param> /// <returns>The ScienceSubject</returns> public static ScienceSubject ScienceSubject(ScienceExperiment experiment, ExperimentSituations situation, CelestialBody body, string biome) { ScienceSubject defaultIfNotResearched = new ScienceSubject(experiment, situation, body, biome); return(ResearchAndDevelopment.GetSubjects().SingleOrDefault(researched => defaultIfNotResearched.id == researched.id) ?? defaultIfNotResearched); }