public bool StoreScience(ModuleScienceContainer container, ScienceSubject subject, float data) { if (container.capacity > 0 && container.GetScienceCount() >= container.capacity) { return(false); } if (container.GetStoredDataCount() != 0) { return(false); } float xmitValue = 0.85f; float labBoost = 0.1f; ScienceData new_data = new ScienceData(data, xmitValue, labBoost, subject.id, subject.title); if (container.AddData(new_data)) { return(true); } return(false); }
private void OnExperimentsResultDialogClosed() { if (FlightGlobals.ActiveVessel != null) { // get all container modules on the vessel List <ModuleScienceContainer> containers = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleScienceContainer>(); // iterate over the containers for (int containerIndex = 0; containerIndex < containers.Count; containerIndex++) { ModuleScienceContainer container = containers[containerIndex]; // get all the experiment modules attached to the same part as the container List <ModuleScienceExperiment> experiments = container.part.FindModulesImplementing <ModuleScienceExperiment>(); // iterate over the experiments for (int experimentIndex = 0; experimentIndex < experiments.Count; experimentIndex++) { ModuleScienceExperiment experiment = experiments[experimentIndex]; // check that experiment has available data if (experiment.GetScienceCount() > 0) { // get both the container and experiment data for duplicate checking ScienceData[] containerDataArray = container.GetData(); ScienceData[] experimentDataArray = experiment.GetData(); // iterate over the experiment data foreach (ScienceData experimentData in experimentDataArray) { bool allowDataTransfer = true; // check for duplicates in the container data foreach (ScienceData containerData in containerDataArray) { if (containerData.subjectID == experimentData.subjectID) { allowDataTransfer = false; // discard duplicates if (HighLogic.CurrentGame.Parameters.CustomParams <SMR>().discardDuplicates) { experiment.DumpData(experimentData); } } } // transfer data from experiment to container if (allowDataTransfer) { experiment.DumpData(experimentData); container.AddData(experimentData); } } } } } } }
private static void TransferScience(IScienceDataContainer source, ModuleScienceContainer target) { if (source == null || target == null || source == target) { return; } ScienceData[] sd = source.GetData(); if (sd == null || sd.Length == 0) { Debug.Log("No data "); return; } if (source is ModuleScienceContainer) { foreach (ScienceData data in sd) { if (TargetAcceptsData(target, data)) { if (target.AddData(data)) { ((ModuleScienceContainer)source).RemoveData(data); } else { Debug.Log("Transfer fail"); } } } } else if (source is ModuleScienceExperiment) { if (TargetAcceptsData(target, sd[0])) { if (target.AddData(sd[0])) { ((ModuleScienceExperiment)source).DumpData(sd[0]); } else { Debug.Log("Transfer fail"); } } } }
private void SaveScienceData() { foreach (ScienceAIData result in results) { ScienceData scienceResult = result.CreateScienceData(); if (!container.HasData(scienceResult)) { container.AddData(scienceResult); } } results.Clear(); }
protected void perfomBiomeAnalysys() { //We need at least one crewmember in the lab. if (this.part.protoModuleCrew.Count == 0) { ScreenMessages.PostScreenMessage(kNoCrew, kMessageDuration, ScreenMessageStyle.UPPER_CENTER); return; } //We need at least one scientist in the lab, or one TERRAIN satellite in orbit. float scienceBonus = getBiomeAnalysisBonus(); //We can run the analysis, add the science bonus if (scienceBonus > 0.0f) { //Generate lab data ScienceData data = WBIBiomeAnalysis.CreateData(this.part, scienceBonus); scienceContainer.AddData(data); scienceContainer.ReviewDataItem(data); swizzler.SwizzleResultsDialog(); } //Ok, do we at least have a TERRAIN satellite in orbit? else if (planetHasTerrainSat()) { ScreenMessages.PostScreenMessage(kAnalysisUplink, kMessageDuration * 1.5f, ScreenMessageStyle.UPPER_CENTER); } else { ScreenMessages.PostScreenMessage(kNoScientistsOrTerrain, kMessageDuration * 1.5f, ScreenMessageStyle.UPPER_CENTER); return; } //Run the analysis biomeScanner.RunAnalysis(); }
protected void keepResults(ScienceData data) { //Give data to the kerbal on EVA if (FlightGlobals.ActiveVessel.isEVA) { ModuleScienceContainer container = FlightGlobals.ActiveVessel.FindPartModuleImplementing <ModuleScienceContainer>(); if (container != null) { container.AddData(data); } Events["TakeKometSample"].active = false; sampleAcquired = true; } }
public override void ReviewData() { float scienceCap = WBIBiomeAnalysis.GetScienceCap(this.part); float totalScience = scienceAdded; if (totalScience < 0.001f) { ScreenMessages.PostScreenMessage(kNoScience, 5.0f, ScreenMessageStyle.UPPER_CENTER); return; } while (totalScience > 0.001f) { //Set the experiment title if (totalScience < scienceCap) { dataAmount = totalScience; } else { dataAmount = scienceCap; } //Generate lab data ScienceData data = WBIBiomeAnalysis.CreateData(this.part, dataAmount); scienceContainer.AddData(data); //Deduct from the total totalScience -= dataAmount; if (totalScience <= 0.001f) { scienceAdded = 0f; } } //Make sure we have some science to transmit. if (scienceContainer.GetScienceCount() == 0) { ScreenMessages.PostScreenMessage(kNoScience, 5.0f, ScreenMessageStyle.UPPER_CENTER); return; } //Review the data scienceContainer.ReviewData(); swizzler.SwizzleResultsDialog(); }
protected override void setupPartModules() { base.setupPartModules(); //Setup the science container if (scienceContainer == null) { scienceContainer = this.part.FindModuleImplementing <ModuleScienceContainer>(); scienceContainer.Events["ReviewDataEvent"].guiActiveUnfocused = false; scienceContainer.Events["ReviewDataEvent"].guiActive = false; //Terrain uplink terrainUplinkView.part = this.part; terrainUplinkView.scienceContainer = scienceContainer; } //Kerbnet access kerbNetAccess = this.part.FindModuleImplementing <ModuleKerbNetAccess>(); if (kerbNetAccess != null) { } //Grab the seismometer (if any) foreach (PartModule mod in this.part.Modules) { if (mod.moduleName == "Seismometer") { impactSeismometer = mod; impactSensor = (IScienceDataContainer)impactSeismometer; ScienceData[] impactData = impactSensor.GetData(); foreach (ScienceData data in impactData) { scienceContainer.AddData(data); } foreach (ScienceData doomed in impactData) { impactSensor.DumpData(doomed); } break; } } }
private bool finishTransfer(Vessel v, ScienceData d, float boost) { if (v == null) { return(false); } if (d == null) { return(false); } if (v.loaded) { List <ModuleScienceContainer> containers = v.FindPartModulesImplementing <ModuleScienceContainer>(); if (containers.Count <= 0) { return(false); } ModuleScienceContainer currentContainer = null; for (int j = containers.Count - 1; j >= 0; j--) { ModuleScienceContainer container = containers[j]; if (container.capacity != 0 && container.GetData().Length >= container.capacity) { continue; } if (container.allowRepeatedSubjects) { currentContainer = container; break; } if (container.HasData(d)) { continue; } currentContainer = container; } if (currentContainer != null) { d.triggered = false; d.dataAmount *= (d.baseTransmitValue * (1 + boost)); d.transmitBonus = 1; d.baseTransmitValue = 1; return(currentContainer.AddData(d)); } } else { List <ProtoPartSnapshot> containers = getProtoContainers(v.protoVessel); if (containers.Count <= 0) { return(false); } ProtoPartModuleSnapshot currentContainer = null; uint host = 0; for (int j = containers.Count - 1; j >= 0; j--) { ProtoPartSnapshot container = containers[j]; host = container.flightID; ProtoPartModuleSnapshot tempContainer = null; for (int k = container.modules.Count - 1; k >= 0; k--) { ProtoPartModuleSnapshot mod = container.modules[k]; if (mod.moduleName != "ModuleScienceContainer") { continue; } tempContainer = mod; break; } if (tempContainer == null) { continue; } List <ScienceData> protoData = new List <ScienceData>(); ConfigNode[] science = tempContainer.moduleValues.GetNodes("ScienceData"); for (int l = science.Length - 1; l >= 0; l--) { ConfigNode node = science[l]; protoData.Add(new ScienceData(node)); } Part prefab = container.partInfo.partPrefab; ModuleScienceContainer prefabContainer = prefab.FindModuleImplementing <ModuleScienceContainer>(); if (prefabContainer != null) { if (prefabContainer.capacity != 0 && protoData.Count >= prefabContainer.capacity) { continue; } if (prefabContainer.allowRepeatedSubjects) { currentContainer = tempContainer; break; } if (HasData(d.subjectID, protoData)) { continue; } currentContainer = tempContainer; } } if (currentContainer != null) { d.triggered = false; d.dataAmount = d.dataAmount * (d.baseTransmitValue * (boost + 1)); d.transmitBonus = 1; d.baseTransmitValue = 1; d.container = host; d.Save(currentContainer.moduleValues.AddNode("ScienceData")); return(true); } } return(false); }
public override void OnStart(StartState state) { base.OnStart(state); SetGuiVisible(false); showResults = false; resourceList = ResourceMap.Instance.GetResourceItemList(HarvestTypes.Planetary, this.part.vessel.mainBody); gps = this.part.FindModuleImplementing<ModuleGPS>(); biomeScanner = this.part.FindModuleImplementing<ModuleBiomeScanner>(); hideStockGUI(); //Grab the seismometer (if any) foreach (PartModule mod in this.part.Modules) if (mod.moduleName == "Seismometer") { impactSeismometer = mod; impactSensor = (IScienceDataContainer)impactSeismometer; break; } //Create swizzler swizzler = new WBIResultsDialogSwizzler(); swizzler.onTransmit = transmitData; //Setup the science container scienceContainer = this.part.FindModuleImplementing<ModuleScienceContainer>(); scienceContainer.Events["ReviewDataEvent"].guiActiveUnfocused = false; scienceContainer.Events["ReviewDataEvent"].guiActive = false; if (impactSensor != null) { ScienceData[] impactData = impactSensor.GetData(); foreach (ScienceData data in impactData) scienceContainer.AddData(data); foreach (ScienceData doomed in impactData) impactSensor.DumpData(doomed); } //Terrain uplink terrainUplinkView.part = this.part; terrainUplinkView.scienceContainer = scienceContainer; //Elapsed time for current experiment if (ModuleIsActive()) { //Get the new elapsed time. int elapsedTimeIndex = (int)currentExperiment; elapsedTime = elapsedTimes[elapsedTimeIndex]; //Reset the research start time. cycleStartTime = Planetarium.GetUniversalTime() - elapsedTime; } CBAttributeMapSO.MapAttribute biome = Utils.GetCurrentBiome(this.part.vessel); biomeName = biome.name; if (this.part.vessel.situation == Vessel.Situations.LANDED || this.part.vessel.situation == Vessel.Situations.SPLASHED || this.part.vessel.situation == Vessel.Situations.PRELAUNCH) { planetID = this.part.vessel.mainBody.flightGlobalsIndex; harvestType = (HarvestTypes)harvestID; } }
public override void OnStart(StartState state) { base.OnStart(state); SetGuiVisible(false); showResults = false; resourceList = ResourceMap.Instance.GetResourceItemList(HarvestTypes.Planetary, this.part.vessel.mainBody); gps = this.part.FindModuleImplementing <ModuleGPS>(); biomeScanner = this.part.FindModuleImplementing <ModuleBiomeScanner>(); hideStockGUI(); //Grab the seismometer (if any) foreach (PartModule mod in this.part.Modules) { if (mod.moduleName == "Seismometer") { impactSeismometer = mod; impactSensor = (IScienceDataContainer)impactSeismometer; break; } } //Create swizzler swizzler = new WBIResultsDialogSwizzler(); swizzler.onTransmit = transmitData; //Setup the science container scienceContainer = this.part.FindModuleImplementing <ModuleScienceContainer>(); scienceContainer.Events["ReviewDataEvent"].guiActiveUnfocused = false; scienceContainer.Events["ReviewDataEvent"].guiActive = false; if (impactSensor != null) { ScienceData[] impactData = impactSensor.GetData(); foreach (ScienceData data in impactData) { scienceContainer.AddData(data); } foreach (ScienceData doomed in impactData) { impactSensor.DumpData(doomed); } } //Terrain uplink terrainUplinkView.part = this.part; terrainUplinkView.scienceContainer = scienceContainer; //Elapsed time for current experiment if (ModuleIsActive()) { //Get the new elapsed time. int elapsedTimeIndex = (int)currentExperiment; elapsedTime = elapsedTimes[elapsedTimeIndex]; //Reset the research start time. cycleStartTime = Planetarium.GetUniversalTime() - elapsedTime; } CBAttributeMapSO.MapAttribute biome = Utils.GetCurrentBiome(this.part.vessel); biomeName = biome.name; if (this.part.vessel.situation == Vessel.Situations.LANDED || this.part.vessel.situation == Vessel.Situations.SPLASHED || this.part.vessel.situation == Vessel.Situations.PRELAUNCH) { planetID = this.part.vessel.mainBody.flightGlobalsIndex; harvestType = (HarvestTypes)harvestID; } }