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; } }
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)); }
/// <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); } } }
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; } } }
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"; } }
public void FindPartModules() { if (converter == null) { converter = this.part.FindModuleImplementing <WBIScienceConverter>(); sciLab = this.part.FindModuleImplementing <ModuleScienceLab>(); scienceContainer = this.part.FindModuleImplementing <ModuleScienceContainer>(); } }
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); //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; } }
public void Start() { ModuleScienceLab scienceLab = this.GetComponent <ModuleScienceLab>(); if (scienceLab != null) { saveLabStorage = scienceLab.dataStorage; } GameEvents.onVesselWasModified.Add(OnVesselWasModified); UpdateLab(); }
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%")); } } } }
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); }
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); } } }
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; } } }
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); }
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 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); }
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); }
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; } }
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); }
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); } }
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); }
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); } }
public void AddScience() { ModuleScienceLab sciLab = this.part.FindModuleImplementing <ModuleScienceLab>(); sciLab.storedScience = 100f; }
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); }
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))); }
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 (); } }