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);
        }
예제 #2
0
        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);
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #3
0
        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();
 }
예제 #5
0
        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();
        }
예제 #6
0
        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;
            }
        }
예제 #7
0
        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();
        }
예제 #8
0
        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);
        }
예제 #10
0
        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;
            }
        }
예제 #11
0
        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;
            }
        }