// postfix patch of 'LoadedGame'
        // Load our undiscovered research list from file and remove undiscovereds from the main list.
        public static void LoadGameInit()
        {
            UndiscoveredResearchList = Current.Game.GetComponent <GameComponent_ImmersiveResearch>().MainResearchDict;
            //loading r Types here until i can figure out a scribing workaround for nested lists

            foreach (ResearchProjectDef proj in FullConcreteResearchList)
            {
                if (proj.HasModExtension <ResearchDefModExtension>())
                {
                    UndiscoveredResearchList.MainResearchDict[proj.defName].ResearchTypes = proj.GetModExtension <ResearchDefModExtension>().researchTypes;
                    UndiscoveredResearchList.MainResearchDict[proj.defName].ResearchSize  = proj.GetModExtension <ResearchDefModExtension>().ResearchSize;
                }
                else
                {
                    List <ResearchTypes> temp = new List <ResearchTypes>();
                    temp.Add(ResearchTypes.Mod);
                    UndiscoveredResearchList.MainResearchDict[proj.defName].ResearchTypes = new List <ResearchTypes>(temp);
                    UndiscoveredResearchList.MainResearchDict[proj.defName].ResearchSize  = ResearchSizes.Unknown;
                }
            }

            EmptyResearchGraphOfUndiscovered(DefDatabase <ResearchProjectDef> .AllDefsListForReading);
            GenerateAllBaseResearchWeightings();
        }
        // postfix patch of 'StartedNewGame'.
        // Initialise our undiscovered research list and remove undiscovereds from the main list.
        public static void NewGameInit()
        {
            UndiscoveredResearchList = Current.Game.GetComponent <GameComponent_ImmersiveResearch>().MainResearchDict;

            UndiscoveredResearchList.MainResearchDict.Clear();
            foreach (ResearchProjectDef proj in FullConcreteResearchList)
            {
                if (UndiscoveredResearchList.MainResearchDict.ContainsKey(proj.defName))
                {
                    //Log.Error("already contains key: " + proj.defName);
                    continue;
                }
                if (proj.IsFinished)
                {
                    if (proj.HasModExtension <ResearchDefModExtension>())
                    {
                        UndiscoveredResearchList.MainResearchDict.Add(proj.defName,
                                                                      new ImmersiveResearchProject(proj));
                    }
                    else
                    {
                        List <ResearchTypes> list = new List <ResearchTypes>();
                        list.Add(ResearchTypes.Mod);
                        UndiscoveredResearchList.MainResearchDict.Add(proj.defName, new ImmersiveResearchProject(proj));
                    }
                }
                else
                {
                    if (proj.HasModExtension <ResearchDefModExtension>())
                    {
                        UndiscoveredResearchList.MainResearchDict.Add(proj.defName,
                                                                      new ImmersiveResearchProject(proj));
                    }
                    else
                    {
                        List <ResearchTypes> list2 = new List <ResearchTypes>();
                        list2.Add(ResearchTypes.Mod);
                        UndiscoveredResearchList.MainResearchDict.Add(proj.defName, new ImmersiveResearchProject(proj));
                    }
                }
            }
            // TODO Figure out why adding proj specific vals in constructor only works on some of the whole dictionary
            foreach (ResearchProjectDef proj in FullConcreteResearchList)
            {
                if (proj.IsFinished)
                {
                    UndiscoveredResearchList.MainResearchDict[proj.defName].IsDiscovered = true;
                }
                else
                {
                    UndiscoveredResearchList.MainResearchDict[proj.defName].IsDiscovered = false;
                }

                if (proj.HasModExtension <ResearchDefModExtension>())
                {
                    UndiscoveredResearchList.MainResearchDict[proj.defName].Weighting     = 0.0f;
                    UndiscoveredResearchList.MainResearchDict[proj.defName].ResearchTypes = proj.GetModExtension <ResearchDefModExtension>().researchTypes;
                    UndiscoveredResearchList.MainResearchDict[proj.defName].ResearchSize  = proj.GetModExtension <ResearchDefModExtension>().ResearchSize;
                }
                else
                {
                    List <ResearchTypes> list2 = new List <ResearchTypes>();
                    list2.Add(ResearchTypes.Mod);
                    UndiscoveredResearchList.MainResearchDict[proj.defName].Weighting     = 0.0f;
                    UndiscoveredResearchList.MainResearchDict[proj.defName].ResearchTypes = list2;
                    UndiscoveredResearchList.MainResearchDict[proj.defName].ResearchSize  = ResearchSizes.Unknown;
                }
            }

            EmptyResearchGraphOfUndiscovered(DefDatabase <ResearchProjectDef> .AllDefsListForReading);
            GenerateAllBaseResearchWeightings();

            // maybe improve tutorial ?
            Find.LetterStack.ReceiveLetter("Immersive Research - Datadisks", "Immersive Research - Datadisks \n\nDatadisks are one way of obtaining new research projects and silver.\n\nYou can find datadisks by disassembling mechanoids, and from exotic traders.\n\nSome datadisks have interesting contents, click on them to see what they contain!", LetterDefOf.NeutralEvent);
            Find.LetterStack.ReceiveLetter("Immersive Research - Experiments", "Immersive Research - Experiments \n\nExperiments are your main way of obtaining new research projects. You may notice that your research window is slightly 'empty'. Don't worry, it is intended with this mod!\n\nExperiments have categorised projects into two categories; 'size' and 'type'. You can choose various combinations to be able to pinpoint which kind of research project you wish to unlock.\n\nTo make this process more bearable, you are able to see how many projects of certain combinations you are able to unlock.", LetterDefOf.NeutralEvent);
            Find.LetterStack.ReceiveLetter("Immersive Research - Studying", "Immersive Research - Studying \n\nAn important feature of this mod is a rudimentary education system. With a Study Table built, colonists will be able study finished experiments and be designated as a 'researcher'.\n\nColonists that are designated as researchers are extremely important, as they carry the colony's scientific knowledge. If your researchers die, you can lose progress on projects that they have knowledge of, even downright losing a project completely.\n\n The more researchers you have that have studied the same experiment, the less progress you will lose on that project. \n\nStudying experiments of research projects you have not discovered will discover them for you.", LetterDefOf.NeutralEvent);
            Find.LetterStack.ReceiveLetter("Immersive Research - Filing Cabinet", "Immersive Research - Filing Cabinet \n\nTo make the process of storing experiments easier, you can construct a Filing Cabinet. This will store all of your finished experiments, and you will be able to retrieve specific experiments at any time.\n\n Be careful though, as losing the cabinet can mean the loss of all of your stored experiments!", LetterDefOf.NeutralEvent);
        }