Ejemplo n.º 1
0
        // 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);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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" );
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 6
0
        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;
        }
Ejemplo n.º 7
0
        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;
                }
            }
        }
Ejemplo n.º 8
0
    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);
    }
Ejemplo n.º 9
0
        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;
        }
Ejemplo n.º 10
0
        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));
        }
Ejemplo n.º 11
0
        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>");
                }
            }
        }
Ejemplo n.º 12
0
        //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));
        }
Ejemplo n.º 13
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();
        }
    }
Ejemplo n.º 14
0
        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);
                }
            }
        }
Ejemplo n.º 15
0
        //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));
        }
Ejemplo n.º 16
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);
                }
            }
        }
Ejemplo n.º 17
0
        //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));
        }
Ejemplo n.º 18
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);
        }