Ejemplo n.º 1
0
        private void processMapNodes()
        {
            List <MapNode> allNodes = MapNode.AllMapNodes;

            for (int i = 0; i < allNodes.Count; i++)
            {
                MapNode currentNode = allNodes[i];
                if (currentNode != null)
                {
                    if (currentNode.mapObject != null)
                    {
                        if (currentNode.mapObject.celestialBody != null)
                        {
                            if (Database.instance.CelestialBodies.ContainsKey(currentNode.mapObject.celestialBody))
                            {
                                CelestialBodyInfo dbCBvalue =
                                    Database.instance.CelestialBodies[currentNode.mapObject.celestialBody];
                                if (!dbCBvalue.isResearched)
                                {
                                    currentNode.VisualIconData.iconEnabled = false;
                                }
                                else
                                {
                                    currentNode.VisualIconData.iconEnabled = true;
                                }
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void Load(ConfigNode node)
        {
            //Does ano old save file exist? If not then we load from persistent.SFS config nodes.
            if (!File.Exists("saves/" + HighLogic.SaveFolder + "/researchbodies.cfg"))
            {
                if (node.HasNode(configNodeName)) //Load SFS config nodes
                {
                    ConfigNode RBsettingsNode = node.GetNode(configNodeName);

                    RBsettingsNode.TryGetValue("Enabled", ref Enabled);
                    RBsettingsNode.TryGetValue("Difficulty", ref Difficulty);
                    RBsettingsNode.TryGetValue("ResearchCost", ref ResearchCost);
                    RBsettingsNode.TryGetValue("ProgressResearchCost", ref ProgressResearchCost);
                    RBsettingsNode.TryGetValue("ScienceReward", ref ScienceReward);
                    RBsettingsNode.TryGetValue("UseAppLauncher", ref UseAppLauncher);
                    RBsettingsNode.TryGetValue("DebugLogging", ref DebugLogging);
                    RBsettingsNode.TryGetValue("chances", ref chances);
                    RBsettingsNode.TryGetValue("enableInSandbox", ref enableInSandbox);
                    RBsettingsNode.TryGetValue("allowTSlevel1", ref allowTSlevel1);

                    var bodyNodes = RBsettingsNode.GetNodes(CelestialBodyInfo.ConfigNodeName);
                    foreach (ConfigNode bodyNode in bodyNodes)
                    {
                        if (bodyNode.HasValue("body"))
                        {
                            CelestialBodyInfo bodyInfo = CelestialBodyInfo.Load(bodyNode);
                            CelestialBody     CB       = FlightGlobals.Bodies.FirstOrDefault(a => a.GetName() == bodyInfo.body);
                            if (CB != null)
                            {
                                Database.instance.CelestialBodies[CB].isResearched  = bodyInfo.isResearched;
                                Database.instance.CelestialBodies[CB].researchState = bodyInfo.researchState;
                                Database.instance.CelestialBodies[CB].ignore        = bodyInfo.ignore;
                            }
                        }
                    }
                }
                else  //No config node, so Must be NEW Game!
                {
                    Enabled         = true;
                    chances         = Database.instance.chances;
                    enableInSandbox = Database.instance.enableInSandbox;
                    allowTSlevel1   = Database.instance.allowTSlevel1;
                    ResearchBodiesController.instance.showStartUI = true;

                    foreach (CelestialBody body in Database.instance.BodyList)
                    {
                        CelestialBodyInfo bodyInfo = new CelestialBodyInfo(body.GetName());
                        Database.instance.CelestialBodies[body].isResearched  = bodyInfo.isResearched;
                        Database.instance.CelestialBodies[body].researchState = bodyInfo.researchState;
                        Database.instance.CelestialBodies[body].ignore        = bodyInfo.ignore;
                    }
                }
            }
            else //OLD Save file found, convert to persistent.sfs confignode and delete file.
            {
                RSTLogWriter.Log("Converting Old Save file to new persistent.sfs config node - Loading old save file");
                ConfigNode mainnode = ConfigNode.Load("saves/" + HighLogic.SaveFolder + "/researchbodies.cfg");
                Difficulty = int.Parse(mainnode.GetNode("RESEARCHBODIES").GetValue("difficulty") ?? "0"); // DEPRECATED!

                ResearchCost         = int.Parse(mainnode.GetNode("RESEARCHBODIES").GetValue("ResearchCost") ?? "10");
                ProgressResearchCost = int.Parse(mainnode.GetNode("RESEARCHBODIES").GetValue("ProgressResearchCost") ?? "5");
                ScienceReward        = int.Parse(mainnode.GetNode("RESEARCHBODIES").GetValue("ResearchCost") ?? "5");

                foreach (CelestialBody cb in Database.instance.BodyList)
                {
                    bool fileContainsCB = false;
                    foreach (ConfigNode oldnode in mainnode.GetNode("RESEARCHBODIES").nodes)
                    {
                        if (cb.GetName().Contains(oldnode.GetValue("body")))
                        {
                            if (bool.Parse(oldnode.GetValue("ignore")))
                            {
                                Database.instance.CelestialBodies[cb].isResearched  = true;
                                Database.instance.CelestialBodies[cb].researchState = 100;
                            }
                            else
                            {
                                Database.instance.CelestialBodies[cb].isResearched = bool.Parse(oldnode.GetValue("isResearched"));
                                if (oldnode.HasValue("researchState"))
                                {
                                    Database.instance.CelestialBodies[cb].researchState = int.Parse(oldnode.GetValue("researchState"));
                                }
                                else
                                {
                                    Database.instance.CelestialBodies[cb].researchState = 0;
                                }
                            }
                            fileContainsCB = true;
                        }
                    }
                    if (!fileContainsCB)
                    {
                        Database.instance.CelestialBodies[cb].isResearched  = false;
                        Database.instance.CelestialBodies[cb].researchState = 0;
                    }
                }
                File.Delete("saves/" + HighLogic.SaveFolder + "/researchbodies.cfg");
                RSTLogWriter.Log("Converted Old Save file to new persistent.sfs config node - Loading/Conversion complete. Old save file deleted");
            }

            RSTLogWriter.Log("RBGameSettings Loading Complete");
        }
Ejemplo n.º 3
0
        public void Load(ConfigNode node)
        {
            //Does an old save file exist? If not then we load from persistent.SFS config nodes.
            if (!File.Exists("saves/" + HighLogic.SaveFolder + "/researchbodies.cfg"))
            {
                if (node.HasNode(configNodeName)) //Load SFS config nodes
                {
                    ConfigNode RBsettingsNode = node.GetNode(configNodeName);

                    foundOldSettings = RBsettingsNode.TryGetValue("Enabled", ref Enabled);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("Difficulty", ref Difficulty);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("ResearchCost", ref ResearchCost);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("ProgressResearchCost", ref ProgressResearchCost);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("ScienceReward", ref ScienceReward);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("UseAppLauncher", ref UseAppLauncher);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("DebugLogging", ref DebugLogging);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("chances", ref chances);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("enableInSandbox", ref enableInSandbox);
                    foundOldSettings = foundOldSettings || RBsettingsNode.TryGetValue("allowTSlevel1", ref allowTSlevel1);

                    var bodyNodes = RBsettingsNode.GetNodes(CelestialBodyInfo.ConfigNodeName);
                    foreach (ConfigNode bodyNode in bodyNodes)
                    {
                        if (bodyNode.HasValue("body"))
                        {
                            CelestialBodyInfo bodyInfo = CelestialBodyInfo.Load(bodyNode);
                            CelestialBody     CB       = FlightGlobals.Bodies.FirstOrDefault(a => a.bodyName == bodyInfo.body);
                            if (CB != null)
                            {
                                Database.instance.CelestialBodies[CB].isResearched  = bodyInfo.isResearched;
                                Database.instance.CelestialBodies[CB].researchState = bodyInfo.researchState;
                                Database.instance.CelestialBodies[CB].ignore        = bodyInfo.ignore;
                            }
                            else
                            {
                                if (Database.instance.isTSTInstalled)
                                {
                                    CelestialBody GalCB = TSTWrapper.actualTSTAPI.CBGalaxies.FirstOrDefault(a => a.bodyName == bodyInfo.body);
                                    if (GalCB != null)
                                    {
                                        CelestialBody cbKey = Database.instance.ContainsBodiesKey(GalCB.bodyName);
                                        if (cbKey != null)
                                        {
                                            Database.instance.CelestialBodies[cbKey].isResearched  = bodyInfo.isResearched;
                                            Database.instance.CelestialBodies[cbKey].researchState = bodyInfo.researchState;
                                            Database.instance.CelestialBodies[cbKey].ignore        = bodyInfo.ignore;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //if (Difficulty == 0) //If difficult == 0 user somehow hasn't selected new game difficulty. So show the startup UI.
                    //    ResearchBodiesController.instance.showStartUI = true;
                }
                else  //No config node, so Must be NEW Game!
                {
                    foreach (CelestialBody body in Database.instance.BodyList)
                    {
                        CelestialBodyInfo bodyInfo = new CelestialBodyInfo(body.GetName());
                        Database.instance.CelestialBodies[body].isResearched  = bodyInfo.isResearched;
                        Database.instance.CelestialBodies[body].researchState = bodyInfo.researchState;
                        Database.instance.CelestialBodies[body].ignore        = bodyInfo.ignore;
                    }
                    Database.instance.onGameStatePostLoad(node);
                }
            }
            else //OLD Save file found, convert to persistent.sfs confignode and delete file.
            {
                RSTLogWriter.Log("Converting Old Save file to new persistent.sfs config node - Loading old save file");
                foundOldSettings = true;
                ConfigNode mainnode = ConfigNode.Load("saves/" + HighLogic.SaveFolder + "/researchbodies.cfg");
                Difficulty           = int.Parse(mainnode.GetNode("RESEARCHBODIES").GetValue("difficulty") ?? "0");
                ResearchCost         = int.Parse(mainnode.GetNode("RESEARCHBODIES").GetValue("ResearchCost") ?? "10");
                ProgressResearchCost = int.Parse(mainnode.GetNode("RESEARCHBODIES").GetValue("ProgressResearchCost") ?? "5");
                ScienceReward        = int.Parse(mainnode.GetNode("RESEARCHBODIES").GetValue("ResearchCost") ?? "5");

                foreach (CelestialBody cb in Database.instance.BodyList)
                {
                    bool fileContainsCB = false;
                    foreach (ConfigNode oldnode in mainnode.GetNode("RESEARCHBODIES").nodes)
                    {
                        if (cb.GetName().Contains(oldnode.GetValue("body")))
                        {
                            if (bool.Parse(oldnode.GetValue("ignore")))
                            {
                                Database.instance.CelestialBodies[cb].isResearched  = true;
                                Database.instance.CelestialBodies[cb].researchState = 100;
                            }
                            else
                            {
                                Database.instance.CelestialBodies[cb].isResearched = bool.Parse(oldnode.GetValue("isResearched"));
                                if (oldnode.HasValue("researchState"))
                                {
                                    Database.instance.CelestialBodies[cb].researchState = int.Parse(oldnode.GetValue("researchState"));
                                }
                                else
                                {
                                    Database.instance.CelestialBodies[cb].researchState = 0;
                                }
                            }
                            fileContainsCB = true;
                        }
                    }
                    if (!fileContainsCB)
                    {
                        Database.instance.CelestialBodies[cb].isResearched  = false;
                        Database.instance.CelestialBodies[cb].researchState = 0;
                    }
                }

                File.Delete("saves/" + HighLogic.SaveFolder + "/researchbodies.cfg");
                RSTLogWriter.Log("unable to load OLD save file. Old save file deleted");
            }


            //So now we have CB data and we should have bunch of settings that from now on are handled by the stock settings integration.
            //If we did find those settings we overwrite the stock settings intregration values, but after this they won't exist any more for this save as we won't save them again here.
            if (foundOldSettings)
            {
                ResearchBodies.Enabled   = Enabled;
                RSTLogWriter.debuggingOn = DebugLogging;
                if (Database.instance != null)
                {
                    Database.instance.RB_SettingsParms.ResearchCost         = ResearchCost;
                    Database.instance.RB_SettingsParms.ProgressResearchCost = ProgressResearchCost;
                    Database.instance.RB_SettingsParms.ScienceReward        = ScienceReward;
                    Database.instance.RB_SettingsParms.DebugLogging         = DebugLogging;
                    Database.instance.RB_SettingsParms.DiscoverySeed        = chances;
                    Database.instance.RB_SettingsParms.Enabledtslvl1        = allowTSlevel1;
                    Database.instance.ApplySettings();
                }
                else
                {
                    RSTLogWriter.Log("Failed to apply old game settings to new Stock settings integration");
                }
            }
            else
            {
                Database.instance.onGameStatePostLoad(node);
            }
            RSTLogWriter.Log("RBGameSettings Loading Complete");
            RSTLogWriter.Flush();
        }
Ejemplo n.º 4
0
        public void LoadDatabase()
        {
            RSTLogWriter.Log("LoadDatabase");
            //RB_SettingsParms = HighLogic.CurrentGame.Parameters.CustomParams<ResearchBodies_SettingsParms>();

            isTSTInstalled = Utilities.IsTSTInstalled;
            if (isTSTInstalled)  //If TST assembly is present, initialise TST wrapper.
            {
                if (!TSTWrapper.InitTSTWrapper())
                {
                    isTSTInstalled = false; //If the initialise of wrapper failed set bool to false, we won't be interfacing to TST today.
                }
            }

            Textures.LoadIconAssets();

            //Get a list of CBs
            for (int i = 0; i < FlightGlobals.Bodies.Count; i++)
            {
                BodyList.Add(FlightGlobals.Bodies[i]);
            }
            if (isTSTInstalled && TSTWrapper.APITSTReady) //If TST is installed add the TST Galaxies to the list.
            {
                for (int i = 0; i < TSTWrapper.actualTSTAPI.CBGalaxies.Count; i++)
                {
                    BodyList.Add(TSTWrapper.actualTSTAPI.CBGalaxies[i]);
                }
            }

            //Process Kopernicus Barycenter's.
            foreach (CelestialBody body in BodyList)
            {
                CelestialBodyInfo bodyinfo = new CelestialBodyInfo(body.GetName());
                if (body.Radius < 100 && !body.name.Contains("TSTGalaxies"))  //This body is a barycenter
                {
                    bodyinfo.KOPbarycenter = true;
                }
                else
                {
                    if (body.referenceBody.Radius < 100)                    // This Bodies Reference Body has a Radius < 100m. IE: It's Part of a Barycenter.
                    {
                        bodyinfo.KOPrelbarycenterBody = body.referenceBody; //Yeah so what... well we need it for pass 2 below.
                    }
                }
                CelestialBodies.Add(body, bodyinfo);
            }
            //Now we look back through any CBs that were related to a barycenter body.
            var dictEnum = CelestialBodies.GetEnumerator();

            while (dictEnum.MoveNext())
            {
                var entry = dictEnum.Current;
                if (entry.Value.KOPrelbarycenterBody != null)
                {
                    //So does this body have any orbitingBodies?
                    //If it does we need to somehow find and link any related Orbit Body.
                    foreach (CelestialBody orbitingBody in entry.Key.orbitingBodies)
                    {
                        CelestialBody findOrbitBody = null;
                        for (int i = 0; i < FlightGlobals.Bodies.Count; i++)
                        {
                            if (FlightGlobals.Bodies[i].name.Contains(entry.Key.name) && FlightGlobals.Bodies[i].name.Contains(orbitingBody.name) && FlightGlobals.Bodies[i].name.Contains("Orbit"))
                            {
                                findOrbitBody = FlightGlobals.Bodies[i];
                                break;
                            }
                        }
                        //so if we found the related Orbit body we store it into the CelestialBodies dictionary.
                        if (findOrbitBody != null)
                        {
                            CelestialBodies[orbitingBody].KOPrelbarycenterBody = findOrbitBody;
                        }
                    }
                }
            }

            dictEnum.Dispose();

            //Load the database.cfg file.
            //===========================
            ConfigNode cfg = ConfigNode.Load(PathDatabasePath);

            string[]   sep            = new string[] { " " };
            ConfigNode researchBodies = cfg.GetNode("RESEARCHBODIES");

            if (researchBodies == null)
            {
                RSTLogWriter.Log("Failed to find Database.cfg RESEARCHBODIES node.");
                return;
            }

            Observatorylvl1Range     = float.Parse(researchBodies.GetValue("observatorylvl1range"));
            Observatorylvl2Range     = float.Parse(researchBodies.GetValue("observatorylvl2range"));
            AllowOldResearchinCareer = bool.Parse(researchBodies.GetValue("allowOldResearchinCareer"));
            DiscoveryByFlyby         = int.Parse(researchBodies.GetValue("discoveryByFlyby"));

            //Get Costs
            string[] _startResearchCosts;
            _startResearchCosts = researchBodies.GetValue("StartResearchCosts").Split(sep, StringSplitOptions.RemoveEmptyEntries);
            StartResearchCosts  = new int[] { int.Parse(_startResearchCosts[0]), int.Parse(_startResearchCosts[1]), int.Parse(_startResearchCosts[2]), int.Parse(_startResearchCosts[3]) };

            string[] _progressResearchCosts;
            _progressResearchCosts = researchBodies.GetValue("ProgressResearchCosts").Split(sep, StringSplitOptions.RemoveEmptyEntries);
            ProgressResearchCosts  = new int[] { int.Parse(_progressResearchCosts[0]), int.Parse(_progressResearchCosts[1]), int.Parse(_progressResearchCosts[2]), int.Parse(_progressResearchCosts[3]) };

            string[] _scienceRewards;
            _scienceRewards = researchBodies.GetValue("ScienceRewards").Split(sep, StringSplitOptions.RemoveEmptyEntries);
            ScienceRewards  = new int[] { int.Parse(_scienceRewards[0]), int.Parse(_scienceRewards[1]), int.Parse(_scienceRewards[2]), int.Parse(_scienceRewards[3]) };

            RSTLogWriter.Log("Loading Priority database");
            foreach (CelestialBody body in BodyList)
            {
                //Load the ondiscovery values - English only, which then get over-written in Locale.cs
                foreach (ConfigNode.Value value in cfg.GetNode("RESEARCHBODIES").GetNode("ONDISCOVERY").values)
                {
                    if (value.name.Contains(body.bodyName))
                    {
                        CelestialBodies[body].discoveryMessage = value.value;
                    }
                }
            }

            //Load the IgnoreData dictionary.
            RSTLogWriter.Log("Loading ignore body list from database");
            foreach (ConfigNode.Value value in researchBodies.GetNode("IGNORELEVELS").values)
            {
                foreach (CelestialBody body in BodyList)
                {
                    if (body.GetName() == value.name)
                    {
                        string[] args;
                        args = value.value.Split(sep, StringSplitOptions.RemoveEmptyEntries);
                        BodyIgnoreData ignoredata = new BodyIgnoreData(bool.Parse(args[0]), bool.Parse(args[1]), bool.Parse(args[2]), bool.Parse(args[3]));
                        CelestialBodies[body].IgnoreData = ignoredata;
                        RSTLogWriter.Log("Body Ignore Data for {0} : {1}", body.GetName(), CelestialBodies[body].IgnoreData);
                    }
                }
            }
            RSTLogWriter.Flush();
            LoadModDatabaseNodes();

            NothingHere.Add("#autoLOC_RBodies_00052");
            NothingHere.Add("#autoLOC_RBodies_00053");
            NothingHere.Add("#autoLOC_RBodies_00054");
            NothingHere.Add("#autoLOC_RBodies_00055");

            RSTLogWriter.Log("Chances to get a body is set to {0}", chances);

            RSTLogWriter.Log("Loaded gamemode-related information : enable mod in sandbox = {0}, allow tracking with Tracking station lvl 1 = {1}", enableInSandbox, allowTSlevel1);

            RSTLogWriter.Flush();
        }
Ejemplo n.º 5
0
        void Start()
        {
            isTSTInstalled = Utilities.IsTSTInstalled;
            if (isTSTInstalled)  //If TST assembly is present, initialise TST wrapper.
            {
                if (!TSTWrapper.InitTSTWrapper())
                {
                    isTSTInstalled = false; //If the initialise of wrapper failed set bool to false, we won't be interfacing to TST today.
                }
            }

            Textures.LoadIconAssets();

            //Get a list of CBs
            BodyList = FlightGlobals.Bodies.ToList();
            if (isTSTInstalled && TSTWrapper.APITSTReady) //If TST is installed add the TST Galaxies to the list.
            {
                BodyList = BodyList.Concat(TSTWrapper.actualTSTAPI.CBGalaxies).ToList();
            }

            //Process Kopernicus Barycenter's.
            foreach (CelestialBody body in BodyList)
            {
                CelestialBodyInfo bodyinfo = new CelestialBodyInfo(body.GetName());
                if (body.Radius < 100 && !body.name.Contains("TSTGalaxies"))  //This body is a barycenter
                {
                    bodyinfo.KOPbarycenter = true;
                }
                else
                {
                    if (body.referenceBody.Radius < 100)                    // This Bodies Reference Body has a Radius < 100m. IE: It's Part of a Barycenter.
                    {
                        bodyinfo.KOPrelbarycenterBody = body.referenceBody; //Yeah so what... well we need it for pass 2 below.
                    }
                }
                CelestialBodies.Add(body, bodyinfo);
            }
            //Now we look back through any CBs that were related to a barycenter body.
            foreach (var CB in CelestialBodies.Where(a => a.Value.KOPrelbarycenterBody != null))
            {
                //So does this body have any orbitingBodies?
                //If it does we need to somehow find and link any related Orbit Body.
                foreach (CelestialBody orbitingBody in CB.Key.orbitingBodies)
                {
                    CelestialBody findOrbitBody =
                        FlightGlobals.Bodies.FirstOrDefault(a => a.name.Contains(CB.Key.name) && a.name.Contains(orbitingBody.name) && a.name.Contains("Orbit"));
                    //so if we found the related Orbit body we store it into the CelestialBodies dictionary.
                    if (findOrbitBody != null)
                    {
                        CelestialBodies[orbitingBody].KOPrelbarycenterBody = findOrbitBody;
                    }
                }
            }

            //Load the database.cfg file.
            //===========================
            ConfigNode cfg = ConfigNode.Load(Locales.PathDatabasePath);

            string[] sep = new string[] { " " };

            //Get Costs
            string[] _startResearchCosts;
            _startResearchCosts = cfg.GetNode("RESEARCHBODIES").GetValue("StartResearchCosts").Split(sep, StringSplitOptions.RemoveEmptyEntries);
            StartResearchCosts  = new int[] { int.Parse(_startResearchCosts[0]), int.Parse(_startResearchCosts[1]), int.Parse(_startResearchCosts[2]), int.Parse(_startResearchCosts[3]) };

            string[] _progressResearchCosts;
            _progressResearchCosts = cfg.GetNode("RESEARCHBODIES").GetValue("ProgressResearchCosts").Split(sep, StringSplitOptions.RemoveEmptyEntries);
            ProgressResearchCosts  = new int[] { int.Parse(_progressResearchCosts[0]), int.Parse(_progressResearchCosts[1]), int.Parse(_progressResearchCosts[2]), int.Parse(_progressResearchCosts[3]) };

            string[] _scienceRewards;
            _scienceRewards = cfg.GetNode("RESEARCHBODIES").GetValue("ScienceRewards").Split(sep, StringSplitOptions.RemoveEmptyEntries);
            ScienceRewards  = new int[] { int.Parse(_scienceRewards[0]), int.Parse(_scienceRewards[1]), int.Parse(_scienceRewards[2]), int.Parse(_scienceRewards[3]) };

            RSTLogWriter.Log_Debug("Loading Priority database");
            foreach (CelestialBody body in BodyList)
            {
                //Load the priorities - DEPRECATED
                string name = body.GetName();
                foreach (ConfigNode.Value value in cfg.GetNode("RESEARCHBODIES").GetNode("PRIORITIES").values)
                {
                    if (name == value.name)
                    {
                        Priority[body] = int.Parse(value.value);
                        RSTLogWriter.Log_Debug("Priority for body {0} set to {1}.", name, value.value);
                    }
                }
                //Load the ondiscovery values - English only, which then get over-written in Locale.cs
                foreach (ConfigNode.Value value in cfg.GetNode("RESEARCHBODIES").GetNode("ONDISCOVERY").values)
                {
                    if (value.name == name)
                    {
                        CelestialBodies[body].discoveryMessage = value.value;
                    }
                    //DiscoveryMessage[value.name] = value.value;
                }
            }

            //Load the IgnoreData dictionary.
            RSTLogWriter.Log_Debug("Loading ignore body list from database");
            foreach (ConfigNode.Value value in cfg.GetNode("RESEARCHBODIES").GetNode("IGNORELEVELS").values)
            {
                foreach (CelestialBody body in BodyList)
                {
                    if (body.GetName() == value.name)
                    {
                        string[] args;
                        args = value.value.Split(sep, StringSplitOptions.RemoveEmptyEntries);
                        BodyIgnoreData ignoredata = new BodyIgnoreData(bool.Parse(args[0]), bool.Parse(args[1]), bool.Parse(args[2]), bool.Parse(args[3]));
                        CelestialBodies[body].IgnoreData = ignoredata;
                        RSTLogWriter.Log_Debug("Body Ignore Data for {0} : {1}", body.GetName(), CelestialBodies[body].IgnoreData);
                    }
                }
            }

            LoadModDatabaseNodes();

            //Load the NothingHere dictionary from the database config file.
            foreach (ConfigNode.Value value in cfg.GetNode("RESEARCHBODIES").GetNode("NOTHING").values)
            {
                if (value.name == "text")
                {
                    NothingHere.Add(value.value);
                }
            }

            //So this is deprecated? Checks all CBs are in the Priority dictionary. Any that aren't are added with priority set to 3.
            foreach (CelestialBody cb in BodyList)
            {
                if (!Priority.Keys.Contains(cb) && !CelestialBodies[cb].ignore)
                {
                    Priority[cb] = 3;
                    RSTLogWriter.Log("Config not found for {0}, priority set to 3.", cb.GetName());
                }
            }

            chances = int.Parse(cfg.GetNode("RESEARCHBODIES").GetValue("chances"));
            RSTLogWriter.Log_Debug("Chances to get a body is set to {0}", chances);
            enableInSandbox = bool.Parse(cfg.GetNode("RESEARCHBODIES").GetValue("enableInSandbox"));
            allowTSlevel1   = bool.Parse(cfg.GetNode("RESEARCHBODIES").GetValue("allowTrackingStationLvl1"));
            if (cfg.GetNode("RESEARCHBODIES").HasValue("useAppLauncher"))
            {
                UseAppLauncher = bool.Parse(cfg.GetNode("RESEARCHBODIES").GetValue("useAppLauncher"));
            }
            RSTLogWriter.Log_Debug("Loaded gamemode-related information : enable mod in sandbox = {0}, allow tracking with Tracking station lvl 1 = {1}", enableInSandbox, allowTSlevel1);


            // Load locales for OnDiscovery - Locales are loaded Immediately gamescene. Before this is loaded in MainMenu.
            if (Locales.currentLocale.LocaleId != "en")
            {
                foreach (CelestialBody body in BodyList)
                {
                    if (Locales.currentLocale.Values.ContainsKey("discovery_" + body.GetName()) && CelestialBodies.ContainsKey(body))
                    {
                        CelestialBodies[body].discoveryMessage = Locales.currentLocale.Values["discovery_" + body.GetName()];
                    }
                }
            }
        }