Esempio n. 1
0
        /// <summary>
        /// Patches the scenario file with science subject data
        /// </summary>
        private static string UpdateScenarioWithScienceSubject(string scenarioData, ScienceSubjectInfo scienceSubject)
        {
            var document = new XmlDocument();

            document.LoadXml(scenarioData);

            var receivedScienceSubjectXmlNode = DeserializeAndImportNode(scienceSubject.Data, scienceSubject.NumBytes, document)?
                                                .SelectSingleNode($"/{ConfigNodeXmlParser.ParentNode}[@name='Science']");

            if (receivedScienceSubjectXmlNode == null)
            {
                return(document.ToIndentedString());
            }

            var parentNode = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}");

            if (parentNode != null)
            {
                var existingNode = parentNode.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ParentNode}[@name='Science']" +
                                                               $@"/{ConfigNodeXmlParser.ValueNode}[@name='id' and text()=""{scienceSubject.Id}""]" +
                                                               $"/parent::{ConfigNodeXmlParser.ParentNode}[@name='Science']");

                if (existingNode != null)
                {
                    existingNode.InnerXml = receivedScienceSubjectXmlNode.InnerXml;
                }
                else
                {
                    var importNode = document.ImportNode(receivedScienceSubjectXmlNode, true);
                    parentNode.AppendChild(importNode);
                }
            }

            return(document.ToIndentedString());
        }
Esempio n. 2
0
        /// <summary>
        /// We received a science subject message so update the scenario file accordingly
        /// </summary>
        public static void WriteScienceSubjectDataToFile(ScienceSubjectInfo scienceSubject)
        {
            Task.Run(() =>
            {
                lock (Semaphore.GetOrAdd("ResearchAndDevelopment", new object()))
                {
                    if (!ScenarioStoreSystem.CurrentScenarios.TryGetValue("ResearchAndDevelopment", out var scenario))
                    {
                        return;
                    }

                    var receivedNode = new ConfigNode(Encoding.UTF8.GetString(scienceSubject.Data, 0, scienceSubject.NumBytes))
                    {
                        Parent = scenario, Name = "Science"
                    };
                    if (receivedNode.IsEmpty())
                    {
                        return;
                    }

                    var techNodes        = scenario.GetNodes("Science").Select(v => v.Value);
                    var specificTechNode = techNodes.FirstOrDefault(n => n.GetValue("id").Value == receivedNode.GetValue("id").Value);
                    if (specificTechNode != null)
                    {
                        scenario.ReplaceNode(specificTechNode, receivedNode);
                    }
                    else
                    {
                        scenario.AddNode(receivedNode);
                    }
                }
            });
        }
Esempio n. 3
0
        /// <summary>
        /// We received a science subject message so update the scenario file accordingly
        /// </summary>
        public static void WriteScienceSubjectDataToFile(ScienceSubjectInfo scienceSubject)
        {
            Task.Run(() =>
            {
                lock (Semaphore.GetOrAdd("ResearchAndDevelopment", new object()))
                {
                    if (!ScenarioStoreSystem.CurrentScenariosInXmlFormat.TryGetValue("ResearchAndDevelopment", out var xmlData))
                    {
                        return;
                    }

                    var updatedText = UpdateScenarioWithScienceSubject(xmlData, scienceSubject);
                    ScenarioStoreSystem.CurrentScenariosInXmlFormat.TryUpdate("ResearchAndDevelopment", updatedText, xmlData);
                }
            });
        }
Esempio n. 4
0
        public void HandleMessage(IServerMessageBase msg)
        {
            if (!(msg.Data is ShareProgressBaseMsgData msgData))
            {
                return;
            }
            if (msgData.ShareProgressMessageType != ShareProgressMessageType.ScienceSubjectUpdate)
            {
                return;
            }

            if (msgData is ShareProgressScienceSubjectMsgData data)
            {
                var subject = new ScienceSubjectInfo(data.ScienceSubject); //create a copy of the tech value so it will not change in the future.
                LunaLog.Log($"Queue Science subject: {subject.Id}");
                System.QueueAction(() =>
                {
                    NewScienceSubject(subject);
                });
            }
        }
Esempio n. 5
0
        private static void NewScienceSubject(ScienceSubjectInfo subject)
        {
            System.StartIgnoringEvents();

            var currentSubjects = System.ScienceSubjects;
            var receivedSubject = ConvertByteArrayToScienceSubject(subject.Data, subject.NumBytes);

            if (!currentSubjects.TryGetValue(subject.Id, out var existingSubject))
            {
                currentSubjects.Add(receivedSubject.id, receivedSubject);
            }
            else
            {
                existingSubject.dataScale       = receivedSubject.dataScale;
                existingSubject.scientificValue = receivedSubject.scientificValue;
                existingSubject.subjectValue    = receivedSubject.subjectValue;
                existingSubject.science         = receivedSubject.science;
                existingSubject.scienceCap      = receivedSubject.scienceCap;
            }

            System.StopIgnoringEvents();
            LunaLog.Log($"Science subject received: {subject.Id}");
        }