private void updateRemainingData()
        {
            List <ScienceData> dataList = new List <ScienceData>();

            if (HighLogic.LoadedSceneIsFlight && FlightGlobals.ready)
            {
                foreach (IScienceDataContainer container in FlightGlobals.ActiveVessel.FindPartModulesImplementing <IScienceDataContainer>())
                {
                    dataList.AddRange(container.GetData());
                }
                if (dataList.Count > 0)
                {
                    foreach (ScienceData data in dataList)
                    {
                        DMScienceData DMData = getDMScience(data.title, true);
                        if (DMData != null)
                        {
                            ScienceSubject sub = ResearchAndDevelopment.GetSubjectByID(data.subjectID);
                            if (sub != null)
                            {
                                sub.scientificValue *= DMData.SciVal;
                                sub.science          = Math.Max(0f, Math.Min(sub.scienceCap, sub.scienceCap - (sub.scienceCap * sub.scientificValue)));
                            }
                        }
                    }
                }
            }
        }
        private void RecoveryWatcher(float sci, ScienceSubject sub, ProtoVessel pv, bool reverse)
        {
            if (HighLogic.LoadedScene == GameScenes.SPACECENTER || HighLogic.LoadedScene == GameScenes.TRACKSTATION)
            {
                float DMScience = sci;
                DMUtils.DebugLog("Science Data Recovered For {0} Science", sci);

                DMScienceData DMData = DMScienceScenario.SciScenario.getDMScience(sub.title);
                if (DMData != null)
                {
                    float oldSciVal = 0f;
                    if (sub.scienceCap != 0)
                    {
                        oldSciVal = Math.Max(0f, 1f - ((sub.science - sci) / sub.scienceCap));
                    }
                    DMScience = sub.subjectValue * DMData.BaseValue * DMData.SciVal * oldSciVal;
                    DMScienceScenario.SciScenario.submitDMScience(DMData, DMScience);
                }
                if (DMScience != sci)
                {
                    float extraScience = sci - DMScience;
                    Debug.LogWarning(string.Format("[DMagic Orbital Science] [Asteroid Science Retrieval] Remove {0} Science From R&D Center After Asteroid Calculations", extraScience));
                    DMUtils.DebugLog("Remove {0} Science From R&D Center: From {1} To {2}", extraScience, ResearchAndDevelopment.Instance.Science, ResearchAndDevelopment.Instance.Science - extraScience);
                    ResearchAndDevelopment.Instance.AddScience(-1f * extraScience, TransactionReasons.ScienceTransmission);
                }
            }
        }
 private void RemoveDMScience(DMScienceData DMdata)
 {
     if (recoveredDMScience.ContainsKey(DMdata.Title))
     {
         recoveredDMScience.Remove(DMdata.Title);
     }
 }
 private void UpdateDMScience(DMScienceData DMData)
 {
     if (recoveredDMScience.ContainsKey(DMData.Title))
     {
         DMScienceData DMSci = recoveredDMScience[DMData.Title];
         DMSci.Science = DMData.Science;
         DMSci.SciVal  = DMData.SciVal;
     }
 }
 internal void submitDMScience(DMScienceData DMData, float science)
 {
     DMData.Science = Math.Min(DMData.Science + science, DMData.Cap);
     DMData.SciVal  = ScienceValue(DMData.Science, DMData.Cap);
     UpdateDMScience(DMData);
     if (HighLogic.LoadedSceneIsFlight && FlightGlobals.ready)
     {
         updateRemainingData();
     }
 }
 private void addDMScience(DMScienceData data)
 {
     if (!recoveredDMScience.ContainsKey(data.Title))
     {
         recoveredDMScience.Add(data.Title, data);
     }
     else
     {
         UpdateDMScience(data);
     }
 }
 private void scienceReceived(float sci, ScienceSubject sub, ProtoVessel pv, bool reverse)
 {
     if (HighLogic.LoadedSceneIsFlight)
     {
         DMScienceData DMData = DMScienceScenario.SciScenario.getDMScience(sub.title);
         if (DMData != null)
         {
             DMScienceScenario.SciScenario.submitDMScience(DMData, sci);
         }
     }
 }
        private void scienceReceived(float sci, ScienceSubject sub, ProtoVessel pv, bool reverse)
        {
            if (sub == null)
            {
                return;
            }

            if (DMScienceScenario.SciScenario == null)
            {
                return;
            }

            sci /= HighLogic.CurrentGame.Parameters.Career.ScienceGainMultiplier;

            if (HighLogic.LoadedSceneIsFlight)
            {
                DMScienceData DMData = DMScienceScenario.SciScenario.getDMScience(sub.title);
                if (DMData != null)
                {
                    DMScienceScenario.SciScenario.submitDMScience(DMData, sci);
                }
            }
        }
        internal void RecordNewScience(string title, float baseval, float scv, float sci, float cap)
        {
            DMScienceData DMData = new DMScienceData(title, baseval, scv, sci, cap);

            addDMScience(DMData);
        }
 private void UpdateDMScience(DMScienceData DMData)
 {
     if (recoveredDMScience.ContainsKey(DMData.Title))
     {
         DMScienceData DMSci = recoveredDMScience[DMData.Title];
         DMSci.Science = DMData.Science;
         DMSci.SciVal = DMData.SciVal;
     }
 }
 private void RemoveDMScience(DMScienceData DMdata)
 {
     if (recoveredDMScience.ContainsKey(DMdata.Title))
         recoveredDMScience.Remove(DMdata.Title);
 }
 private void addDMScience(DMScienceData data)
 {
     if (!recoveredDMScience.ContainsKey(data.Title))
         recoveredDMScience.Add(data.Title, data);
     else
         UpdateDMScience(data);
 }
 internal void submitDMScience(DMScienceData DMData, float science)
 {
     DMData.Science = Math.Min(DMData.Science + science, DMData.Cap);
     DMData.SciVal = ScienceValue(DMData.Science, DMData.Cap);
     UpdateDMScience(DMData);
     if (HighLogic.LoadedSceneIsFlight && FlightGlobals.ready)
         updateRemainingData();
 }
 internal void RecordNewScience(string title, float baseval, float scv, float sci, float cap)
 {
     DMScienceData DMData = new DMScienceData(title, baseval, scv, sci, cap);
     addDMScience(DMData);
 }