示例#1
0
        public override void OnStart(StartState state)
        {
            base.OnStart(state);
            converter        = this.part.FindModuleImplementing <WBIScienceConverter>();
            sciLab           = this.part.FindModuleImplementing <ModuleScienceLab>();
            scienceContainer = this.part.FindModuleImplementing <ModuleScienceContainer>();

            publishIconWhite = GameDatabase.Instance.GetTexture("WildBlueIndustries/Pathfinder/Icons/WBIPublishWhite", false);
            sellIconWhite    = GameDatabase.Instance.GetTexture("WildBlueIndustries/Pathfinder/Icons/WBISellWhite", false);
            scienceIconWhite = GameDatabase.Instance.GetTexture("WildBlueIndustries/Pathfinder/Icons/WBIScienceWhite", false);

            publishIconBlack = GameDatabase.Instance.GetTexture("WildBlueIndustries/Pathfinder/Icons/WBIPublish", false);
            sellIconBlack    = GameDatabase.Instance.GetTexture("WildBlueIndustries/Pathfinder/Icons/WBISell", false);
            scienceIconBlack = GameDatabase.Instance.GetTexture("WildBlueIndustries/Pathfinder/Icons/WBIScience", false);

            publishIcon = publishIconBlack;
            sellIcon    = sellIconBlack;
            scienceIcon = scienceIconBlack;

            //If we want to show the ops view dialog instead of the context buttons,
            //then hide the context buttons.
            if (showOpsView)
            {
                Events["ShowOpsView"].guiActive = true;

                converter.Events["TransmitResearch"].guiActive       = false;
                converter.Events["PublishResearch"].guiActive        = false;
                converter.Events["SellResearch"].guiActive           = false;
                converter.Events["StartResourceConverter"].guiActive = false;
                converter.Events["StopResourceConverter"].guiActive  = false;
            }
        }
示例#2
0
        public static float GetNextReportValue(ScienceSubject subject, ScienceExperiment experiment, List <ScienceData> onboard, float xmitScalar = 1f)
        {
            var data = new ScienceData(experiment.baseValue * experiment.dataScale * HighLogic.CurrentGame.Parameters.Career.ScienceGainMultiplier, xmitScalar, 0f, subject.id, string.Empty);

            data.labBoost = ModuleScienceLab.GetBoostForVesselData(FlightGlobals.ActiveVessel, data);

            xmitScalar += data.labBoost;

#if DEBUG
            //Log.Debug("GetNextReportValue for {0}, calculated labBoost of {1}", experiment.experimentTitle, data.labBoost);
#endif
            if (onboard.Count == 0)
            {
                return(ResearchAndDevelopment.GetScienceValue(experiment.baseValue * experiment.dataScale, subject, xmitScalar) * HighLogic.CurrentGame.Parameters.Career.ScienceGainMultiplier);
            }

            float experimentValue = ResearchAndDevelopment.GetNextScienceValue(experiment.baseValue * experiment.dataScale, subject, xmitScalar) * HighLogic.CurrentGame.Parameters.Career.ScienceGainMultiplier;

            if (onboard.Count == 1)
            {
                return(experimentValue);
            }

            // we'll have to estimate
            return(experimentValue / UnityEngine.Mathf.Pow(4f, onboard.Count - 1));
        }
示例#3
0
        /// <summary>Fixes null persistent fields in the module.</summary>
        /// <remarks>Used to prevent NREs in methods that persist KSP fields.</remarks>
        /// <param name="module">The module to fix.</param>
        static void CleanupFieldsInModule(PartModule module)
        {
            // HACK: Fix uninitialized fields in science lab module.
            ModuleScienceLab scienceModule = module as ModuleScienceLab;

            if (scienceModule != null)
            {
                scienceModule.ExperimentData = new List <string>();
                Core.Log("WORKAROUND. Fix null field in ModuleScienceLab module on the part prefab: " + module, LogLevel.Important);
            }

            // Ensure the module is awaken. Otherwise, any access to base fields list will result in NRE.
            // HACK: Accessing Fields property of a non-awaken module triggers NRE. If it happens then do
            // explicit awakening of the *base* module class.
            try
            {
                module.Fields.GetEnumerator();
            }
            catch
            {
                Core.Log("WORKAROUND. Module " + module + " on part prefab is not awaken. Call Awake on it", LogLevel.Important);
                module.Awake();
            }
            foreach (BaseField field in module.Fields)
            {
                BaseField baseField = field as BaseField;
                if (baseField.isPersistant && baseField.GetValue(module) == null)
                {
                    StandardOrdinaryTypesProto proto = new StandardOrdinaryTypesProto();
                    object defValue = proto.ParseFromString("", baseField.FieldInfo.FieldType);
                    Core.Log("WORKAROUND. Found null field " + baseField.name + " in module prefab " + module + ", fixing to default value of type " + baseField.FieldInfo.FieldType + ": " + defValue, LogLevel.Important);
                    baseField.SetValue(defValue, module);
                }
            }
        }
示例#4
0
        protected void updateScienceLab()
        {
            bool enableMPLModules = false;

            if (CurrentTemplate.HasValue("enableMPLModules"))
            {
                enableMPLModules = bool.Parse(CurrentTemplate.GetValue("enableMPLModules"));
            }

            ModuleScienceLab sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();

            if (sciLab != null)
            {
                if (HighLogic.LoadedSceneIsEditor)
                {
                    sciLab.isEnabled = false;
                    sciLab.enabled   = false;
                }

                else if (enableMPLModules)
                {
                    sciLab.isEnabled     = true;
                    sciLab.enabled       = true;
                    sciLab.crewsRequired = originalCrewsRequired;
                }
                else
                {
                    sciLab.crewsRequired = 2000.0f;
                    sciLab.isEnabled     = false;
                    sciLab.enabled       = false;
                }
            }
        }
示例#5
0
        public override void OnStart(StartState state)
        {
            ModuleScienceLab sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();

            if (sciLab != null)
            {
                originalCrewsRequired = sciLab.crewsRequired;
            }

            base.OnStart(state);

            if (HighLogic.LoadedSceneIsEditor == false && fieldReconfigurable == false)
            {
                ShowGUI = false;
            }

            if (string.IsNullOrEmpty(opsViewTitle) == false)
            {
                opsManagerView.WindowTitle = opsViewTitle;
            }

            if (string.IsNullOrEmpty(resourcesToKeep))
            {
                resourcesToKeep = "ElectricCharge";
            }
        }
示例#6
0
 public void FindPartModules()
 {
     if (converter == null)
     {
         converter        = this.part.FindModuleImplementing <WBIScienceConverter>();
         sciLab           = this.part.FindModuleImplementing <ModuleScienceLab>();
         scienceContainer = this.part.FindModuleImplementing <ModuleScienceContainer>();
     }
 }
示例#7
0
        public override void OnStart(StartState state)
        {
            base.OnStart(state);

            //Get the science lab and hide its transmit button. We'll use our own buttons.
            sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();
            sciLab.Events["TransmitScience"].guiActive = false;

            transmitHelper.part = this.part;
        }
示例#8
0
        public override void OnStart(StartState state)
        {
            base.OnStart(state);

            //Get the science lab and hide its transmit button. We'll use our own buttons.
            sciLab = this.part.FindModuleImplementing<ModuleScienceLab>();
            sciLab.Events["TransmitScience"].guiActive = false;

            transmitHelper.part = this.part;
        }
        public override void OnStart(StartState state)
        {
            base.OnStart(state);

            sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();

            if (sciLab != null && debugMode)
            {
                Fields["AddData"].guiActive = true;
            }
        }
示例#10
0
        public void Start()
        {
            ModuleScienceLab scienceLab = this.GetComponent <ModuleScienceLab>();

            if (scienceLab != null)
            {
                saveLabStorage = scienceLab.dataStorage;
            }
            GameEvents.onVesselWasModified.Add(OnVesselWasModified);
            UpdateLab();
        }
示例#11
0
        private void Start()
        {
            List <AvailablePart> parts = PartLoader.LoadedPartsList.Where
                                             (p => p.partPrefab.Modules.GetModules <ModuleScienceConverter>().Any() &&
                                             p.partPrefab.Modules.GetModules <ModuleScienceLab>().Any()).ToList();

            foreach (AvailablePart part in parts)
            {
                List <ModuleScienceConverter> modulesSC = part.partPrefab.Modules.GetModules <ModuleScienceConverter>();
                List <ModuleScienceLab>       modulesSL = part.partPrefab.Modules.GetModules <ModuleScienceLab>();

                if (modulesSC.Count != 1)
                {
                    continue;
                }
                if (modulesSL.Count != 1)
                {
                    continue;
                }

                ModuleScienceConverter moduleSC = modulesSC[0];
                ModuleScienceLab       moduleSL = modulesSL[0];

                moduleSL.Fields.ToString();

                List <AvailablePart.ModuleInfo> modinfos = part.moduleInfos;

                foreach (AvailablePart.ModuleInfo modinfo in modinfos)
                {
                    if (modinfo.moduleName == moduleSL.GUIName)
                    {
                        double lab_modifier = moduleSC.dataProcessingMultiplier / 0.5 * Math.Pow(10, 7 - moduleSC.researchTime);

                        modinfo.info =
                            Localizer.Format("#SLI_ScientistsRequired", moduleSL.crewsRequired)
                            + Localizer.Format("#SLI_PowerUsage", moduleSC.powerRequirement)
                            + Localizer.Format("#SLI_DataStorage", moduleSL.dataStorage)
                            + Localizer.Format("#SLI_ScienceStorage", moduleSC.scienceCap)
                            + Localizer.Format("#SLI_DatatoScience", moduleSC.scienceMultiplier)

                            + Localizer.Format("#SLI_ResearchSpeed")
                            + " " + Localizer.Format("#SLI_TheLabModifier", lab_modifier.ToString("#0.0#"))
                            + " " + Localizer.Format("#SLI_ScientistLevelBonus", (moduleSC.scientistBonus).ToString("+#0%;-#0%"))

                            + Localizer.Format("#SLI_DataBonuses")
                            + " " + Localizer.Format("#SLI_SurfaceBonus", moduleSL.SurfaceBonus.ToString("+#0%;-#0%"))
                            + " " + Localizer.Format("#SLI_ContextBonus", moduleSL.ContextBonus.ToString("+#0%;-#0%"))
                            + " " + Localizer.Format("#SLI_HomeworldBonus", (moduleSL.homeworldMultiplier - 1).ToString("+#0%;-#0%"));
                    }
                }
            }
        }
示例#12
0
        public void Start()
        {
            List <ModuleScienceConverter> listMSC = part.Modules.GetModules <ModuleScienceConverter>();
            List <ModuleScienceLab>       listMSL = part.Modules.GetModules <ModuleScienceLab>();

            if (listMSC.Count != 1)
            {
                return;
            }
            if (listMSL.Count != 1)
            {
                return;
            }

            ModuleSC = listMSC[0];
            ModuleSL = listMSL[0];

            // --- Hide Stock Fields
            ModuleSC.Fields["sciString"].guiActive    = false;
            ModuleSC.Fields["datString"].guiActive    = false;
            ModuleSC.Fields["rateString"].guiActive   = false;
            ModuleSC.Fields["status"].guiActive       = false;
            ModuleSC.Fields["status"].guiActiveEditor = false;
            ModuleSL.Fields["statusText"].guiActive   = false;

            DataToScience_str = "1:" + ModuleSC.scienceMultiplier;

            PowerConsumption_str = ModuleSC.powerRequirement + " " + Localizer.Format("#autoLOC_7001414"); // EC/s

            if (HighLogic.LoadedScene == GameScenes.EDITOR)
            {
                UpdateScientistFieldsInEditor();
            }
            else if (HighLogic.LoadedScene == GameScenes.FLIGHT)
            {
                UpdateScientistFieldsInFlight();
            }

            double labModifier = ModuleSC.dataProcessingMultiplier / 0.5 * Math.Pow(10, 7 - ModuleSC.researchTime);

            LabModifier_str = String.Format("×{0:F2}", labModifier);

            if (labModifier == 1.0)
            {
                Fields["LabModifier_str"].guiActive       = false;
                Fields["LabModifier_str"].guiActiveEditor = false;
            }


            GameEvents.onEditorScreenChange.Add(OnEditorScreenChange);
            GameEvents.onVesselCrewWasModified.Add(OnVesselCrewWasModified);
        }
示例#13
0
        protected void sendDataToLab(ScienceData science_data)
        {
            ModuleScienceLab moduleScienceLab = part.FindModuleImplementing <ModuleScienceLab>();

            if (moduleScienceLab != null && science_data != null && data_gend)
            {
                if (moduleScienceLab.dataStored + science_data.dataAmount <= moduleScienceLab.dataStorage)
                {
                    moduleScienceLab.dataStored += science_data.labValue;
                    endExperiment(science_data);
                }
            }
        }
示例#14
0
        public override void RedecorateModule(bool loadTemplateResources = true)
        {
            base.RedecorateModule(loadTemplateResources);
            bool enableMPLModules = false;

            if (CurrentTemplate.HasValue("enableMPLModules"))
            {
                enableMPLModules = bool.Parse(CurrentTemplate.GetValue("enableMPLModules"));
            }

            ModuleScienceLab sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();

            if (sciLab != null)
            {
                if (HighLogic.LoadedSceneIsEditor)
                {
                    sciLab.isEnabled = false;
                    sciLab.enabled   = false;
                }

                else if (enableMPLModules)
                {
                    sciLab.isEnabled     = true;
                    sciLab.enabled       = true;
                    sciLab.crewsRequired = originalCrewsRequired;
                }
                else
                {
                    sciLab.crewsRequired = 2000.0f;
                    sciLab.isEnabled     = false;
                    sciLab.enabled       = false;
                }
            }

            ModuleScienceConverter converter = this.part.FindModuleImplementing <ModuleScienceConverter>();

            if (converter != null)
            {
                if (HighLogic.LoadedSceneIsEditor)
                {
                    converter.isEnabled = enableMPLModules;
                    converter.enabled   = enableMPLModules;
                }

                else
                {
                    converter.isEnabled = enableMPLModules;
                    converter.enabled   = enableMPLModules;
                }
            }
        }
示例#15
0
        public override void OnStart(StartState state)
        {
            ModuleScienceLab sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();

            if (sciLab != null)
            {
                originalCrewsRequired = sciLab.crewsRequired;
            }
            scienceConverter = this.part.FindModuleImplementing <WBIScienceConverter>();
            scienceConverter.SetGuiVisible(false);
            base.OnStart(state);
            if (string.IsNullOrEmpty(resourcesToKeep))
            {
                resourcesToKeep = "ElectricCharge";
            }
        }
        protected void sendDataToLab(ScienceData science_data)
        {
            ModuleScienceLab moduleScienceLab = part.FindModuleImplementing <ModuleScienceLab>();

            if (moduleScienceLab == null || science_data == null || !data_gend)
            {
                return;
            }

            if (!(moduleScienceLab.dataStored + science_data.dataAmount <= moduleScienceLab.dataStorage))
            {
                return;
            }

            moduleScienceLab.dataStored += science_data.labValue;
            endExperiment(science_data);
        }
示例#17
0
        public override void OnStart(StartState state)
        {
            base.OnStart(state);

            //Get the science lab and hide its transmit button. We'll use our own buttons.
            sciLab = this.part.FindModuleImplementing<ModuleScienceLab>();
            sciLab.Events["TransmitScience"].guiActive = false;

            transmitHelper.part = this.part;
            transmitHelper.transmitCompleteDelegate = DataTransmitted;

            if (HighLogic.CurrentGame.Mode != Game.Modes.CAREER)
            {
                Events["PublishResearch"].guiActive = false;
                Events["SellResearch"].guiActive = false;
            }
        }
示例#18
0
        public override void OnStart(StartState state)
        {
            base.OnStart(state);

            //Get the science lab and hide its transmit button. We'll use our own buttons.
            sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();
            sciLab.Events["TransmitScience"].guiActive = false;

            transmitHelper.part = this.part;
            transmitHelper.transmitCompleteDelegate = DataTransmitted;

            if (HighLogic.CurrentGame.Mode != Game.Modes.CAREER)
            {
                Events["PublishResearch"].guiActive = false;
                Events["SellResearch"].guiActive    = false;
            }
        }
        public void ShowResults(string experimentID, float amount, ModuleScienceLab lab = null)
        {
            ScienceExperiment experiment = ResearchAndDevelopment.GetExperiment(experimentID);
            ScienceSubject subject = ResearchAndDevelopment.GetExperimentSubject(experiment, ScienceUtil.GetExperimentSituation(part.vessel),
                part.vessel.mainBody, Utils.GetCurrentBiome(part.vessel).name);

            //Kerbin low orbit has a science multiplier of 1.
            ScienceSubject subjectLEO = ResearchAndDevelopment.GetExperimentSubject(experiment, ExperimentSituations.InSpaceLow,
                FlightGlobals.GetHomeBody(), "");

            //This ensures you can re-run the experiment.
            subjectLEO.science = 0f;
            subjectLEO.scientificValue = 1f;

            //Create science data
            ScienceData data = new ScienceData(amount, 1f, 0f, subjectLEO.id, subject.title);

            ShowResults(data, lab);
        }
示例#20
0
        public void ShowResults(string experimentID, float amount, ModuleScienceLab lab = null)
        {
            ScienceExperiment experiment = ResearchAndDevelopment.GetExperiment(experimentID);
            ScienceSubject    subject    = ResearchAndDevelopment.GetExperimentSubject(experiment, ScienceUtil.GetExperimentSituation(part.vessel),
                                                                                       part.vessel.mainBody, Utils.GetCurrentBiome(part.vessel).name);

            //Kerbin low orbit has a science multiplier of 1.
            ScienceSubject subjectLEO = ResearchAndDevelopment.GetExperimentSubject(experiment, ExperimentSituations.InSpaceLow,
                                                                                    FlightGlobals.GetHomeBody(), "");

            //This ensures you can re-run the experiment.
            subjectLEO.science         = 0f;
            subjectLEO.scientificValue = 1f;

            //Create science data
            ScienceData data = new ScienceData(amount, 1f, 0f, subjectLEO.id, subject.title);

            ShowResults(data, lab);
        }
        public void ShowResults(ScienceData data, ModuleScienceLab lab = null)
        {
            scienceLab = lab;
            bool hasLab = scienceLab != null ? true : false;

            if (lab != null)
            {
                contextBonus   = lab.ContextBonus;
                surfaceBonus   = lab.SurfaceBonus;
                homeworldBonus = lab.homeworldMultiplier;

                lab.ContextBonus        = 0;
                lab.SurfaceBonus        = 0;
                lab.homeworldMultiplier = 0;
            }

            //Now show the dialog
            ExperimentResultDialogPage page = new ExperimentResultDialogPage(part, data, data.transmitValue, data.labBoost, false, "", true, hasLab, Reset, Keep, Transmit, Process);
            ExperimentsResultDialog    dlg  = ExperimentsResultDialog.DisplayResult(page);
        }
示例#22
0
        public virtual void TransferToScienceLab()
        {
            ModuleScienceLab lab = this.part.FindModuleImplementing <ModuleScienceLab>();

            if (lab == null)
            {
                List <ModuleScienceLab> labs = this.part.vessel.FindPartModulesImplementing <ModuleScienceLab>();

                foreach (ModuleScienceLab scienceLab in labs)
                {
                    if (scienceLab.isEnabled && scienceLab.enabled && scienceLab.part.protoModuleCrew.Count >= scienceLab.crewsRequired)
                    {
                        lab = scienceLab;
                        break;
                    }
                }
            }

            //No lab on the vessel? Then we're done.
            if (lab == null)
            {
                ScreenMessages.PostScreenMessage("Can't find an available/crewed laboratory!", 5.0f, ScreenMessageStyle.UPPER_CENTER);
                Log("No ModuleScienceLab to transfer to!");
                return;
            }

            //Transfer as much as we can to the lab.
            float availableStorage = lab.dataStorage - lab.dataStored;

            if (scienceAdded < availableStorage)
            {
                lab.dataStored += scienceAdded;
                scienceAdded    = 0f;
            }

            else
            {
                lab.dataStored = lab.dataStorage;
                scienceAdded  -= availableStorage;
            }
        }
示例#23
0
        public virtual void ReviewData()
        {
            if (scienceAdded == 0 && reputationAdded == 0 && fundsAdded == 0)
            {
                ScreenMessages.PostScreenMessage(noResearchDataMsg, 5.0f, ScreenMessageStyle.UPPER_CENTER);
                return;
            }

            ModuleScienceLab        lab  = null;
            List <ModuleScienceLab> labs = this.part.vessel.FindPartModulesImplementing <ModuleScienceLab>();

            if (labs != null)
            {
                if (labs.Count > 0)
                {
                    lab = labs.First <ModuleScienceLab>();
                }
            }

            fakeExperiment.ShowResults(experimentID, dataAmount, lab);
        }
示例#24
0
        private void UpdateLab()
        {
            ModuleScienceLab scienceLab = this.GetComponent <ModuleScienceLab>();

            if (part.Resources.Contains(labResource))
            {
                if (scienceLab != null)
                {
                    // Enable the lab
                    scienceLab.dataStorage = saveLabStorage;
                }
                SetCrewCapacity(crewCapacity);
            }
            else
            {
                if (scienceLab != null)
                {
                    // Disable the lab
                    scienceLab.dataStorage = 0.0f;
                }
                SetCrewCapacity(0);
            }
        }
示例#25
0
 private void experimentResultsPage(ScienceData data)
 {
     if (scienceReports.Count > 0)
     {
         ExperimentResultDialogPage page = new ExperimentResultDialogPage(part, data, transmitValue, ModuleScienceLab.GetBoostForVesselData(vessel, data), false, "", true, new ScienceLabSearch(vessel, data), new Callback <ScienceData>(onDiscardData), new Callback <ScienceData>(onKeepData), new Callback <ScienceData>(onTransmitData), new Callback <ScienceData>(onSendToLab));
         ExperimentsResultDialog.DisplayResult(page);
     }
 }
 public override bool Initialize(PartModule pm)
 {
     base.Initialize(pm);
     lab = (ModuleScienceLab)pm;
     return(true);
 }
示例#27
0
文件: KRnDUI.cs 项目: JoeBostic/KRnD
        private void OnWindow(int window_id)
        {
            try {
                GUILayout.BeginVertical();

                // Get all modules of the selected part:
                var                            part_title               = "";
                Part                           part                     = null;
                KRnDModule                     rnd_module               = null;
                List <ModuleEngines>           engine_modules           = null;
                ModuleRCS                      rcs_module               = null;
                ModuleReactionWheel            reaction_wheel_module    = null;
                ModuleDeployableSolarPanel     solar_panel_module       = null;
                ModuleWheelBase                landing_leg_module       = null;
                PartResource                   electric_charge_resource = null;
                ModuleGenerator                generator_module         = null;
                PartModule                     fission_generator        = null;
                List <ModuleResourceConverter> converter_modules        = null;
                ModuleParachute                parachute_module         = null;
                ModuleDataTransmitter          antenna_module           = null;
                ModuleScienceLab               science_lab              = null;
                List <PartResource>            fuel_resources           = null;
                ModuleResourceHarvester        harvester_module         = null;
                ModuleActiveRadiator           radiator_module          = null;
                ELConverter                    el_converter             = null;


                if (selectedPart != null)
                {
                    foreach (var a_part in PartLoader.LoadedPartsList)
                    {
                        if (a_part.partPrefab.name == selectedPart.name)
                        {
                            part       = a_part.partPrefab;
                            part_title = a_part.title;
                            break;
                        }
                    }

                    if (part)
                    {
                        antenna_module           = PartStats.GetModuleDataTransmitter(part);
                        science_lab              = PartStats.GetModuleScienceLab(part);
                        rnd_module               = PartStats.GetKRnDModule(part);
                        engine_modules           = PartStats.GetModuleEnginesList(part);
                        rcs_module               = PartStats.GetModuleRCS(part);
                        reaction_wheel_module    = PartStats.GetModuleReactionWheel(part);
                        solar_panel_module       = PartStats.GetModuleDeployableSolarPanel(part);
                        landing_leg_module       = PartStats.GetModuleWheelBase(part);
                        electric_charge_resource = PartStats.GetElectricCharge(part);
                        generator_module         = PartStats.GetModuleGenerator(part);
                        fission_generator        = PartStats.GetFissionGenerator(part);
                        converter_modules        = PartStats.GetModuleResourceConverterList(part);
                        parachute_module         = PartStats.GetModuleParachute(part);
                        fuel_resources           = PartStats.GetFuelResources(part);
                        harvester_module         = PartStats.GetModuleResourceHarvester(part);
                        radiator_module          = PartStats.GetModuleActiveRadiator(part);
                        el_converter             = PartStats.GetModuleElConverter(part);
                    }
                }

                if (!part)
                {
                    // No part selected:
                    GUILayout.BeginArea(new Rect(10, 5, _windowStyle.fixedWidth, 20));
                    GUILayout.Label("<b>Kerbal R&D: Select a part to improve</b>", _labelStyle);
                    GUILayout.EndArea();
                    GUILayout.EndVertical();
                    GUI.DragWindow();
                    return;
                }

                if (!rnd_module)
                {
                    // Invalid part selected:
                    GUILayout.BeginArea(new Rect(10, 5, _windowStyle.fixedWidth, 20));
                    GUILayout.Label("<b>Kerbal R&D: Select a different part to improve</b>", _labelStyle);
                    GUILayout.EndArea();
                    GUILayout.EndVertical();
                    GUI.DragWindow();
                    return;
                }

                // Get stats of the current version of the selected part:
                if (!KRnD.upgrades.TryGetValue(part.name, out var current_upgrade))
                {
                    current_upgrade = new PartUpgrades();
                }
                var current_info = BuildPartInfoString(part, current_upgrade);

                // Create a copy of the part-stats which we can use to mock an upgrade further below:
                var next_upgrade = current_upgrade.Clone();

                // Title:
                GUILayout.BeginArea(new Rect(10, 5, _windowStyle.fixedWidth, 20));
                var version = rnd_module.GetVersion();
                if (version != "")
                {
                    version = " - " + version;
                }
                GUILayout.Label("<b>" + part_title + version + "</b>", _labelStyle);
                GUILayout.EndArea();

                // List with upgrade-options:
                float options_width  = 100;
                var   options_height = _windowStyle.fixedHeight - 30 - 30 - 20;
                GUILayout.BeginArea(new Rect(10, 30 + 20, options_width, options_height));


                GUILayout.BeginVertical();

                var options = new List <string> {
                    "Dry Mass", "Max Temp"
                };
                if (engine_modules != null || rcs_module)
                {
                    options.Add("ISP Vac");
                    options.Add("ISP Atm");
                    options.Add("Fuel Flow");
                }

                if (antenna_module != null)
                {
                    options.Add("Antenna Power");
                }
                if (antenna_module != null && antenna_module.antennaType != AntennaType.INTERNAL)
                {
                    options.Add("Packet Size");
                }
                if (science_lab != null)
                {
                    options.Add("Data Storage");
                }

                if (reaction_wheel_module != null)
                {
                    options.Add("Torque");
                }
                if (solar_panel_module != null)
                {
                    options.Add("Charge Rate");
                }
                if (landing_leg_module != null)
                {
                    options.Add("Crash Tolerance");
                }
                if (electric_charge_resource != null)
                {
                    options.Add("Battery");
                }
                //if (fuel_resources != null) options.Add("Fuel Pressure");
                if (generator_module || fission_generator)
                {
                    options.Add("Generator");
                }
                if (converter_modules != null)
                {
                    options.Add("Converter");
                }
                if (parachute_module)
                {
                    options.Add("Parachute");
                }
                if (harvester_module)
                {
                    options.Add("Harvester");
                }
                if (radiator_module)
                {
                    options.Add("Radiator");
                }
                if (el_converter)
                {
                    options.Add("EL Converter");
                }

                if (_selectedUpgradeOption >= options.Count)
                {
                    _selectedUpgradeOption = 0;
                }
                _selectedUpgradeOption = GUILayout.SelectionGrid(_selectedUpgradeOption, options.ToArray(), 1, _buttonStyle);

                GUILayout.EndVertical();

                GUILayout.EndArea();

                var              selected_upgrade_option = options.ToArray()[_selectedUpgradeOption];
                int              current_upgrade_level;
                int              next_upgrade_level;
                int              science_cost;
                float            current_improvement_factor;
                float            next_improvement_factor;
                UpgradeConstants u_constants;

                if (!KRnD.originalStats.TryGetValue(part.name, out var original_stats))
                {
                    throw new Exception("no original-stats for part '" + part.name + "'");
                }

                //Func<PartUpgrades, int> improve_function;
                if (selected_upgrade_option == "ISP Vac")
                {
                    //improve_function = KRnD.ImproveIspVac;
                    current_upgrade_level      = current_upgrade.ispVac;
                    next_upgrade_level         = ++next_upgrade.ispVac;
                    u_constants                = ValueConstants.GetData(StringConstants.ISP_VAC);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.ispVac);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.ispVac);
                    science_cost               = u_constants.CalculateScienceCost(0, next_upgrade.ispVac);
                }
                else if (selected_upgrade_option == "ISP Atm")
                {
                    //improve_function = KRnD.ImproveIspAtm;
                    current_upgrade_level      = current_upgrade.ispAtm;
                    next_upgrade_level         = ++next_upgrade.ispAtm;
                    u_constants                = ValueConstants.GetData(StringConstants.ISP_ATM);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.ispAtm);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.ispAtm);
                    science_cost               = u_constants.CalculateScienceCost(0, next_upgrade.ispAtm);
                }
                else if (selected_upgrade_option == "Fuel Flow")
                {
                    //improve_function = KRnD.ImproveFuelFlow;
                    current_upgrade_level      = current_upgrade.fuelFlow;
                    next_upgrade_level         = ++next_upgrade.fuelFlow;
                    u_constants                = ValueConstants.GetData(StringConstants.FUEL_FLOW);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.fuelFlow);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.fuelFlow);
                    science_cost               = u_constants.CalculateScienceCost(0, next_upgrade.fuelFlow);
                }
                else if (selected_upgrade_option == "Dry Mass")
                {
                    //improve_function = KRnD.ImproveDryMass;
                    current_upgrade_level      = current_upgrade.dryMass;
                    next_upgrade_level         = ++next_upgrade.dryMass;
                    u_constants                = ValueConstants.GetData(StringConstants.DRY_MASS);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.dryMass);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.dryMass);
                    science_cost               = u_constants.CalculateScienceCost(original_stats.dryMass, next_upgrade.dryMass);
                }
                else if (selected_upgrade_option == "Torque")
                {
                    //improve_function = KRnD.ImproveTorque;
                    current_upgrade_level      = current_upgrade.torqueStrength;
                    next_upgrade_level         = ++next_upgrade.torqueStrength;
                    u_constants                = ValueConstants.GetData(StringConstants.TORQUE);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.torqueStrength);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.torqueStrength);
                    science_cost               = u_constants.CalculateScienceCost(original_stats.torqueStrength, next_upgrade.torqueStrength);
                }
                else if (selected_upgrade_option == "Antenna Power")
                {
                    //improve_function = KRnD.ImproveAntennaPower;
                    current_upgrade_level      = current_upgrade.antennaPower;
                    next_upgrade_level         = ++next_upgrade.antennaPower;
                    u_constants                = ValueConstants.GetData(StringConstants.ANTENNA_POWER);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.antennaPower);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.antennaPower);
                    science_cost               = u_constants.CalculateScienceCost((float)original_stats.antennaPower, next_upgrade.antennaPower);
                }
                else if (selected_upgrade_option == "Packet Size")
                {
                    //improve_function = KRnD.ImprovePacketSize;
                    current_upgrade_level      = current_upgrade.packetSize;
                    next_upgrade_level         = ++next_upgrade.packetSize;
                    u_constants                = ValueConstants.GetData(StringConstants.PACKET_SIZE);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.packetSize);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.packetSize);
                    science_cost               = u_constants.CalculateScienceCost(original_stats.packetSize, next_upgrade.packetSize);
                }
                else if (selected_upgrade_option == "Data Storage")
                {
                    //improve_function = KRnD.ImproveDataStorage;
                    current_upgrade_level      = current_upgrade.dataStorage;
                    next_upgrade_level         = ++next_upgrade.dataStorage;
                    u_constants                = ValueConstants.GetData(StringConstants.DATA_STORAGE);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.dataStorage);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.dataStorage);
                    science_cost               = u_constants.CalculateScienceCost(original_stats.dataStorage, next_upgrade.dataStorage);
                }
                else if (selected_upgrade_option == "Harvester")
                {
                    //improve_function = KRnD.ImproveResourceHarvester;
                    current_upgrade_level      = current_upgrade.resourceHarvester;
                    next_upgrade_level         = ++next_upgrade.resourceHarvester;
                    u_constants                = ValueConstants.GetData(StringConstants.RESOURCE_HARVESTER);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.resourceHarvester);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.resourceHarvester);
                    science_cost               = u_constants.CalculateScienceCost(original_stats.resourceHarvester, next_upgrade.resourceHarvester);
                }
                else if (selected_upgrade_option == "Radiator")
                {
                    //improve_function = KRnD.ImproveActiveRadiator;
                    current_upgrade_level      = current_upgrade.maxEnergyTransfer;
                    next_upgrade_level         = ++next_upgrade.maxEnergyTransfer;
                    u_constants                = ValueConstants.GetData(StringConstants.ENERGY_TRANSFER);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.maxEnergyTransfer);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.maxEnergyTransfer);
                    science_cost               = u_constants.CalculateScienceCost((float)original_stats.maxEnergyTransfer, next_upgrade.maxEnergyTransfer);
                }
                else if (selected_upgrade_option == "Charge Rate")
                {
                    //improve_function = KRnD.ImproveChargeRate;
                    current_upgrade_level      = current_upgrade.efficiencyMult;
                    next_upgrade_level         = ++next_upgrade.efficiencyMult;
                    u_constants                = ValueConstants.GetData(StringConstants.CHARGE_RATE);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.efficiencyMult);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.efficiencyMult);
                    science_cost               = u_constants.CalculateScienceCost(original_stats.efficiencyMult, next_upgrade.efficiencyMult);
                }
                else if (selected_upgrade_option == "Crash Tolerance")
                {
                    //improve_function = KRnD.ImproveCrashTolerance;
                    current_upgrade_level      = current_upgrade.crashTolerance;
                    next_upgrade_level         = ++next_upgrade.crashTolerance;
                    u_constants                = ValueConstants.GetData(StringConstants.CRASH_TOLERANCE);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.crashTolerance);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.crashTolerance);
                    science_cost               = u_constants.CalculateScienceCost(original_stats.crashTolerance, next_upgrade.crashTolerance);
                }
                else if (selected_upgrade_option == "Battery")
                {
                    //improve_function = KRnD.ImproveBatteryCharge;
                    current_upgrade_level      = current_upgrade.batteryCharge;
                    next_upgrade_level         = ++next_upgrade.batteryCharge;
                    u_constants                = ValueConstants.GetData(StringConstants.BATTERY_CHARGE);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.batteryCharge);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.batteryCharge);
                    science_cost               = u_constants.CalculateScienceCost((float)original_stats.batteryCharge, next_upgrade.batteryCharge);
                }
                else if (selected_upgrade_option == "Fuel Pressure")
                {
                    //improve_function = KRnD.ImproveFuelCapacity;
                    current_upgrade_level      = current_upgrade.fuelCapacity;
                    next_upgrade_level         = ++next_upgrade.fuelCapacity;
                    u_constants                = ValueConstants.GetData(StringConstants.FUEL_CAPACITY);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.fuelCapacity);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.fuelCapacity);
                    science_cost               = u_constants.CalculateScienceCost((float)original_stats.fuelCapacitiesSum, next_upgrade.fuelCapacity);
                }
                else if (selected_upgrade_option == "Generator")
                {
                    //improve_function = KRnD.ImproveGeneratorEfficiency;
                    current_upgrade_level      = current_upgrade.generatorEfficiency;
                    next_upgrade_level         = ++next_upgrade.generatorEfficiency;
                    u_constants                = ValueConstants.GetData(StringConstants.GENERATOR_EFFICIENCY);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.generatorEfficiency);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.generatorEfficiency);
                    science_cost               = u_constants.CalculateScienceCost(0, next_upgrade.generatorEfficiency);
                }
                else if (selected_upgrade_option == "Converter")
                {
                    //improve_function = KRnD.ImproveConverterEfficiency;
                    current_upgrade_level      = current_upgrade.converterEfficiency;
                    next_upgrade_level         = ++next_upgrade.converterEfficiency;
                    u_constants                = ValueConstants.GetData(StringConstants.CONVERTER_EFFICIENCY);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.converterEfficiency);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.converterEfficiency);
                    science_cost               = u_constants.CalculateScienceCost(0, next_upgrade.converterEfficiency);
                }
                else if (selected_upgrade_option == "Parachute")
                {
                    //improve_function = KRnD.ImproveParachuteStrength;
                    current_upgrade_level      = current_upgrade.parachuteStrength;
                    next_upgrade_level         = ++next_upgrade.parachuteStrength;
                    u_constants                = ValueConstants.GetData(StringConstants.PARACHUTE_STRENGTH);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.parachuteStrength);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.parachuteStrength);
                    science_cost               = u_constants.CalculateScienceCost((float)original_stats.chuteMaxTemp, next_upgrade.parachuteStrength);
                }
                else if (selected_upgrade_option == "Max Temp")
                {
                    //improve_function = KRnD.ImproveMaxTemperature;
                    current_upgrade_level      = current_upgrade.maxTemperature;
                    next_upgrade_level         = ++next_upgrade.maxTemperature;
                    u_constants                = ValueConstants.GetData(StringConstants.MAX_TEMPERATURE);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.maxTemperature);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.maxTemperature);
                    science_cost               = u_constants.CalculateScienceCost((float)original_stats.intMaxTemp, next_upgrade.maxTemperature);
                }
                else if (selected_upgrade_option == "EL Converter")
                {
                    //improve_function = KRnD.ImproveMaxTemperature;
                    current_upgrade_level      = current_upgrade.elConverter;
                    next_upgrade_level         = ++next_upgrade.elConverter;
                    u_constants                = ValueConstants.GetData(StringConstants.EL_CONVERTER);
                    current_improvement_factor = u_constants.CalculateImprovementFactor(current_upgrade.elConverter);
                    next_improvement_factor    = u_constants.CalculateImprovementFactor(next_upgrade.elConverter);
                    science_cost               = u_constants.CalculateScienceCost((float)original_stats.ELConverter, next_upgrade.elConverter);
                }
                else
                {
                    throw new Exception("unexpected option '" + selected_upgrade_option + "'");
                }

                var new_info = BuildPartInfoString(part, next_upgrade);                 // Calculate part-info if the selected stat was upgraded.
                new_info = HighlightChanges(current_info, new_info);

                // Current stats:
                GUILayout.BeginArea(new Rect(10 + options_width + 10, 30, _windowStyle.fixedWidth, 20));
                GUILayout.Label("<color=#FFFFFF><b>Current:</b> " + current_upgrade_level + " (" + current_improvement_factor.ToString("+0.##%;-0.##%;-") + ")</color>", _labelStyle);
                GUILayout.EndArea();

                var area_width  = (_windowStyle.fixedWidth - 20 - options_width) / 2;
                var area_height = options_height;
                GUILayout.BeginArea(new Rect(10 + options_width, 30 + 20, area_width, area_height));
                _scrollPos = GUILayout.BeginScrollView(_scrollPos, _scrollStyle, GUILayout.Width(area_width), GUILayout.Height(area_height));

                GUILayout.Label(current_info, _labelStyleSmall);
                GUILayout.EndScrollView();
                GUILayout.EndArea();

                // Next stats:
                GUILayout.BeginArea(new Rect(10 + options_width + area_width + 10, 30, _windowStyle.fixedWidth, 20));
                GUILayout.Label("<color=#FFFFFF><b>Next upgrade:</b> " + next_upgrade_level + " (" + next_improvement_factor.ToString("+0.##%;-0.##%;-") + ")</color>", _labelStyle);
                GUILayout.EndArea();

                GUILayout.BeginArea(new Rect(10 + options_width + area_width, 30 + 20, area_width, area_height));
                _scrollPos = GUILayout.BeginScrollView(_scrollPos, _scrollStyle, GUILayout.Width(area_width), GUILayout.Height(area_height));
                GUILayout.Label(new_info, _labelStyleSmall);
                GUILayout.EndScrollView();
                GUILayout.EndArea();

                // Bottom-line (display only if the upgrade would have an effect):
                if (Math.Abs(current_improvement_factor - next_improvement_factor) > float.Epsilon)
                {
                    GUILayout.BeginArea(new Rect(10, _windowStyle.fixedHeight - 25, _windowStyle.fixedWidth, 30));
                    float current_science = 0;
                    if (ResearchAndDevelopment.Instance != null)
                    {
                        current_science = ResearchAndDevelopment.Instance.Science;
                    }
                    var color = "FF0000";
                    if (current_science >= science_cost)
                    {
                        color = "00FF00";
                    }
                    GUILayout.Label("<b>Science: <color=#" + color + ">" + science_cost + " / " + Math.Floor(current_science) + "</color></b>", _labelStyle);
                    GUILayout.EndArea();
                    if (current_science >= science_cost && ResearchAndDevelopment.Instance != null && u_constants != null /*&& improve_function != null*/)
                    {
                        GUILayout.BeginArea(new Rect(_windowStyle.fixedWidth - 110, _windowStyle.fixedHeight - 30, 100, 30));
                        if (GUILayout.Button("Research", _buttonStyle))
                        {
                            //upgrade_function(part);
                            try {
                                if (!KRnD.upgrades.TryGetValue(part.name, out var store))
                                {
                                    store = new PartUpgrades();
                                    KRnD.upgrades.Add(part.name, store);
                                }

                                u_constants.upgradeFunction(store);
                                //improve_function(store);
                                KRnD.UpdateGlobalParts();
                                KRnD.UpdateEditorVessel();
                            } catch (Exception e) {
                                Debug.LogError("[KRnD] UpgradeIspVac(): " + e);
                            }



                            ResearchAndDevelopment.Instance.AddScience(-science_cost, TransactionReasons.RnDTechResearch);
                        }

                        GUILayout.EndArea();
                    }
                }

                GUILayout.EndVertical();
                GUI.DragWindow();
            } catch (Exception e) {
                Debug.LogError("[KRnD] GenerateWindow(): " + e);
            }
        }
示例#28
0
        public void AddScience()
        {
            ModuleScienceLab sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();

            sciLab.storedScience = 100f;
        }
示例#29
0
        public void AddScienceData()
        {
            ModuleScienceLab sciLab = this.part.FindModuleImplementing <ModuleScienceLab>();

            sciLab.dataStored = 100f;
        }
        private bool labWithCrew(Vessel v)
        {
            if (v == null || v.protoVessel == null)
            {
                return(false);
            }

            if (v.loaded)
            {
                List <ModuleScienceLab> labs = v.FindPartModulesImplementing <ModuleScienceLab>();

                for (int i = labs.Count - 1; i >= 0; i--)
                {
                    ModuleScienceLab lab = labs[i];

                    if (lab == null)
                    {
                        continue;
                    }

                    if (lab.part.protoModuleCrew.Count >= lab.crewsRequired)
                    {
                        return(true);
                    }
                }
            }
            else
            {
                for (int i = v.protoVessel.protoPartSnapshots.Count - 1; i >= 0; i--)
                {
                    ProtoPartSnapshot part = v.protoVessel.protoPartSnapshots[i];

                    if (part == null)
                    {
                        continue;
                    }

                    for (int j = part.modules.Count - 1; j >= 0; j--)
                    {
                        ProtoPartModuleSnapshot mod = part.modules[j];

                        if (mod == null)
                        {
                            continue;
                        }

                        if (mod.moduleName != "ModuleScienceLab")
                        {
                            continue;
                        }

                        int crew = (int)getCrewRequired(part);

                        if (part.protoModuleCrew.Count >= crew)
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
示例#31
0
        public void ReviewData()
        {
            if (handler == null)
            {
                return;
            }

            if (handler.GetScienceCount() <= 0)
            {
                return;
            }

            ScienceData data = handler.GetData()[0];

            results = ExperimentsResultDialog.DisplayResult(new ExperimentResultDialogPage(part, data, data.transmitValue, ModuleScienceLab.GetBoostForVesselData(vessel, data), false, transmitWarningText, true, new ScienceLabSearch(vessel, data), new Callback <ScienceData>(onDiscardData), new Callback <ScienceData>(onKeepData), new Callback <ScienceData>(onTransmitData), new Callback <ScienceData>(onSendToLab)));
        }
示例#32
0
        public override void OnStart(StartState state)
        {
            moduleScienceLab       = part.FindModuleImplementing <ModuleScienceLab>();
            moduleScienceConverter = part.FindModuleImplementing <ModuleScienceConverter>();

            if (moduleScienceConverter != null && moduleScienceLab != null)
            {
                DetermineTechLevel();

                var scienceCap = GetScienceCap();
                moduleScienceLab.dataStorage      = scienceCap;
                moduleScienceConverter.scienceCap = scienceCap;

                var deminishingScienceModifier = moduleScienceLab.dataStored >= baseDataStorage ? 1 : moduleScienceLab.dataStored / baseDataStorage;

                dataProcessingMultiplier = moduleScienceLab.dataStored < float.Epsilon ? 0.5f
                    : deminishingScienceModifier * (baseDataStorage / moduleScienceLab.dataStorage) * (moduleScienceLab.dataStorage / moduleScienceLab.dataStored) * 0.5f;
                moduleScienceConverter.dataProcessingMultiplier = dataProcessingMultiplier;
            }

            if (state == StartState.Editor)
            {
                if (this.HasTechsRequiredToUpgrade())
                {
                    isupgraded = true;
                    upgradePartModule();
                }
                return;
            }

            if (isupgraded)
            {
                upgradePartModule();
            }
            else
            {
                if (this.HasTechsRequiredToUpgrade())
                {
                    hasrequiredupgrade = true;
                }
            }

            // update gui names

            /*
             * Events["BeginResearch"].guiName = beginResearchName;
             */

            reprocessor = new NuclearFuelReprocessor();
            reprocessor.Initialize(part, null);
            antimatterGenerator = new AntimatterGenerator(part, 1, PartResourceLibrary.Instance.GetDefinition(ResourceSettings.Config.AntiProtium));

            Debug.Log("[KSPI]: ScienceModule on " + part.name + " was Force Activated");
            part.force_activate();

            anim  = part.FindModelAnimators(animName1).FirstOrDefault();
            anim2 = part.FindModelAnimators(animName2).FirstOrDefault();
            if (anim != null && anim2 != null)
            {
                if (IsEnabled)
                {
                    //anim [animName1].normalizedTime = 1f;
                    //anim2 [animName2].normalizedTime = 1f;
                    //anim [animName1].speed = -1f;
                    //anim2 [animName2].speed = -1f;
                    anim.Blend(animName1, 1, 0);
                    anim2.Blend(animName2, 1, 0);
                }
                else
                {
                    //anim [animName1].normalizedTime = 0f;
                    //anim2 [animName2].normalizedTime = 0f;
                    //anim [animName1].speed = 1f;
                    //anim2 [animName2].speed = 1f;
                    //anim.Blend (animName1, 0, 0);global_rate_multipliers
                    //anim2.Blend (animName2, 0, 0);
                    play_down = false;
                }
                //anim.Play ();
                //anim2.Play ();
            }

            if (IsEnabled && last_active_time != 0)
            {
                double globalRateMultipliers = 1;
                crew_capacity_ratio   = part.protoModuleCrew.Count / (float)part.CrewCapacity;
                globalRateMultipliers = globalRateMultipliers * crew_capacity_ratio;

                /*
                 * if (active_mode == 0) // Science persistence
                 * {
                 *  var time_diff = Planetarium.GetUniversalTime() - last_active_time;
                 *  var altitude_multiplier = Math.Max((vessel.altitude / (vessel.mainBody.Radius)), 1);
                 *  var kerbalResearchSkillFactor = part.protoModuleCrew.Sum(proto_crew_member => GetKerbalScienceFactor(proto_crew_member) / 2f);
                 *
                 *  double science_to_increment = kerbalResearchSkillFactor * GameConstants.baseScienceRate * time_diff
                 *      / PluginHelper.SecondsInDay * electrical_power_ratio * global_rate_multipliers * PluginHelper.getScienceMultiplier(vessel)
                 *      / (Math.Sqrt(altitude_multiplier));
                 *
                 *  science_to_increment = (double.IsNaN(science_to_increment) || double.IsInfinity(science_to_increment)) ? 0 : science_to_increment;
                 *  science_to_add += science_to_increment;
                 *
                 * }
                 * else
                 */
                if (active_mode == 2) // Antimatter persistence
                {
                    var deltaTime = Planetarium.GetUniversalTime() - last_active_time;

                    var electricalPowerProvidedInMegajoules = electrical_power_ratio * globalRateMultipliers * powerReqMult * PluginSettings.Config.BaseAMFPowerConsumption * deltaTime;

                    antimatterGenerator.Produce(electricalPowerProvidedInMegajoules);
                }
            }
        }
        public override void OnStart(StartState state)
        {
            moduleScienceLab       = part.FindModuleImplementing <ModuleScienceLab>();
            moduleScienceConverter = part.FindModuleImplementing <ModuleScienceConverter>();

            if (moduleScienceConverter != null && moduleScienceLab != null)
            {
                DetermineTechLevel();

                var scienceCap = GetScienceCap();
                moduleScienceLab.dataStorage      = scienceCap;
                moduleScienceConverter.scienceCap = scienceCap;

                var deminishingScienceModifier = moduleScienceLab.dataStored >= baseDataStorage ? 1 : moduleScienceLab.dataStored / baseDataStorage;

                dataProcessingMultiplier = moduleScienceLab.dataStored < float.Epsilon ? 0.5f
                    : deminishingScienceModifier * (baseDataStorage / moduleScienceLab.dataStorage) * (moduleScienceLab.dataStorage / moduleScienceLab.dataStored) * 0.5f;
                moduleScienceConverter.dataProcessingMultiplier = dataProcessingMultiplier;
            }

            if (state == StartState.Editor)
            {
                if (this.HasTechsRequiredToUpgrade())
                {
                    isupgraded = true;
                    upgradePartModule();
                }
                return;
            }

            if (isupgraded)
            {
                upgradePartModule();
            }
            else
            {
                if (this.HasTechsRequiredToUpgrade())
                {
                    hasRequiredUpgrade = true;
                }
            }

            // update gui names

            /*
             * Events["BeginResearch"].guiName = beginResearchName;
             */

            reprocessor = new NuclearFuelReprocessor();
            reprocessor.Initialize(part);
            antimatterGenerator = new AntimatterGenerator(part, 1, PartResourceLibrary.Instance.GetDefinition(KITResourceSettings.AntiProtium));

            Debug.Log("[KSPI]: ScienceModule on " + part.name + " was Force Activated");
            part.force_activate();

            anim  = part.FindModelAnimators(animName1).FirstOrDefault();
            anim2 = part.FindModelAnimators(animName2).FirstOrDefault();
            if (anim != null && anim2 != null)
            {
                if (IsEnabled)
                {
                    //anim [animName1].normalizedTime = 1f;
                    //anim2 [animName2].normalizedTime = 1f;
                    //anim [animName1].speed = -1f;
                    //anim2 [animName2].speed = -1f;
                    anim.Blend(animName1, 1, 0);
                    anim2.Blend(animName2, 1, 0);
                }
                else
                {
                    //anim [animName1].normalizedTime = 0f;
                    //anim2 [animName2].normalizedTime = 0f;
                    //anim [animName1].speed = 1f;
                    //anim2 [animName2].speed = 1f;
                    //anim.Blend (animName1, 0, 0);global_rate_multipliers
                    //anim2.Blend (animName2, 0, 0);
                    play_down = false;
                }
                //anim.Play ();
                //anim2.Play ();
            }
        }
        public void ShowResults(ScienceData data, ModuleScienceLab lab = null)
        {
            scienceLab = lab;
            bool hasLab = scienceLab != null ? true : false;

            if (lab != null)
            {
                contextBonus = lab.ContextBonus;
                surfaceBonus = lab.SurfaceBonus;
                homeworldBonus = lab.homeworldMultiplier;

                lab.ContextBonus = 0;
                lab.SurfaceBonus = 0;
                lab.homeworldMultiplier = 0;
            }

            //Now show the dialog
            ExperimentResultDialogPage page = new ExperimentResultDialogPage(part, data, data.transmitValue, data.labBoost, false, "", true, hasLab, Reset, Keep, Transmit, Process);
            ExperimentsResultDialog dlg = ExperimentsResultDialog.DisplayResult(page);
        }