Пример #1
0
        private static ImpactScienceData createSpectralData(CelestialBody crashBody, Vessel crashVessel, uint flightID)
        {
            double crashVelocity = crashVessel.srf_velocity.magnitude;

            Log("Velocity=" + crashVelocity);
            float  crashMasss  = crashVessel.GetTotalMass() * 1000;
            double crashEnergy = 0.5 * crashMasss * crashVelocity * crashVelocity; //KE of crash

            ScienceExperiment experiment = ResearchAndDevelopment.GetExperiment("ImpactSpectrometer");
            String            biome      = ScienceUtil.GetExperimentBiome(crashBody, crashVessel.latitude, crashVessel.longitude);
            CBAttributeMapSO  m          = crashBody.BiomeMap;

            CBAttributeMapSO.MapAttribute[] atts = m.Attributes;
            ScienceSubject subject = ResearchAndDevelopment.GetExperimentSubject(experiment, ExperimentSituations.InSpaceLow, crashBody, biome, biome);
            double         science = subject.scienceCap;

            Log("Impact took place in " + biome + " at " + crashVessel.latitude + "," + crashVessel.longitude);
            String flavourText = "Impact at <<1>> on <<2>>";

            science  = Math.Max(0, science - subject.science);
            science /= subject.subjectValue;

            ImpactScienceData data = new ImpactScienceData(ImpactScienceData.DataTypes.Spectral,
                                                           0, biome, crashVessel.latitude,
                                                           (float)(science * subject.dataScale), 1f, 0, subject.id,
                                                           Localizer.Format(flavourText, biome, crashBody.GetDisplayName()), false, flightID);

            ScreenMessages.PostScreenMessage(
                Localizer.Format("#autoLOC_Screen_Spectrum", biome, crashBody.GetDisplayName()),
                5.0f, ScreenMessageStyle.UPPER_RIGHT);

            return(data);
        }
Пример #2
0
 private void landedVessel(CelestialBody crashBody, Vessel vessel, Vessel crashVessel)
 {
     Log("And it is landed");
     if (vessel.loaded)
     {
         List <Seismometer> seismographs = vessel.FindPartModulesImplementing <Seismometer>();
         if (seismographs.Count != 0)
         {
             Log("Found seismographs");
             ImpactScienceData data = createSeismicData(crashBody, crashVessel, seismographs[0].part.flightID);
             ImpactCoordinator.getInstance().bangListeners.Fire(data);
             seismographs[0].addExperiment(data);
         }
     }
     else
     {
         List <ProtoPartSnapshot> parts = vessel.protoVessel.protoPartSnapshots;
         foreach (ProtoPartSnapshot snap in parts)
         {
             foreach (ProtoPartModuleSnapshot mod in snap.modules)
             {
                 if (mod.moduleName == "Seismometer")
                 {
                     Log("Found seismographs");
                     ImpactScienceData data = createSeismicData(crashBody, crashVessel, snap.flightID);
                     ImpactCoordinator.getInstance().bangListeners.Fire(data);
                     Seismometer.NewResult(mod.moduleValues, data);
                     return;
                 }
             }
         }
     }
 }
Пример #3
0
        private static ImpactScienceData createAsteroidSpectralData(CelestialBody crashBody, Vessel asteroid, Vessel crashVessel, uint flightID)
        {
            double crashVelocity = crashVessel.srf_velocity.magnitude;

            Log("Velocity=" + crashVelocity);
            float  crashMasss  = crashVessel.GetTotalMass() * 1000;
            double crashEnergy = 0.5 * crashMasss * crashVelocity * crashVelocity; //KE of crash

            ScienceExperiment    experiment = ResearchAndDevelopment.GetExperiment("AsteroidSpectometry");
            ExperimentSituations situation  = ScienceUtil.GetExperimentSituation(asteroid);

            ScienceSubject subject = ResearchAndDevelopment.GetExperimentSubject(experiment, situation, asteroid.id.ToString(), asteroid.GetName(), crashBody, "", "");
            double         science = subject.scienceCap;

            Log("Impact took place in " + situation);
            String flavourText = "Impact at <<1>> on <<2>>";


            science /= subject.subjectValue;

            ImpactScienceData data = new ImpactScienceData(0, asteroid.GetName(),
                                                           (float)(science * subject.dataScale), 1f, 0, subject.id,
                                                           Localizer.Format(flavourText, asteroid.GetName(), crashBody.GetDisplayName()), false, flightID);

            ScreenMessages.PostScreenMessage(
                Localizer.Format("#autoLOC_Screen_Asteroid", asteroid.GetName(), crashBody.GetDisplayName()),
                5.0f, ScreenMessageStyle.UPPER_RIGHT);

            return(data);
        }
Пример #4
0
        private static ImpactScienceData createSeismicData(CelestialBody crashBody, Vessel crashVessel, uint flightID)
        {
            double crashVelocity = crashVessel.srf_velocity.magnitude;

            Log("Velocity=" + crashVelocity);
            float  crashMasss  = crashVessel.GetTotalMass() * 1000;
            double crashEnergy = 0.5 * crashMasss * crashVelocity * crashVelocity; //KE of crash


            ScienceExperiment experiment = ResearchAndDevelopment.GetExperiment("ImpactSeismometer");
            ScienceSubject    subject    = ResearchAndDevelopment.GetExperimentSubject(experiment, ExperimentSituations.SrfLanded, crashBody, "", "");
            double            science    = translateKEToScience(crashEnergy, crashBody, subject);

            String flavourText = "Impact of <<1>> on <<2>>";

            Log(" caluculated science =" + science);
            science = Math.Max(0.01, science - subject.science);
            Log("residual science =" + science);

            science /= subject.subjectValue;
            Log("divided science =" + science);

            ImpactScienceData data = new ImpactScienceData(ImpactScienceData.DataTypes.Seismic,
                                                           (float)crashEnergy, null, crashVessel.latitude,
                                                           (float)(science * subject.dataScale), 1f, 0, subject.id,
                                                           Localizer.Format(flavourText, energyFormat(crashEnergy), crashBody.GetDisplayName()), false, flightID);

            ScreenMessages.PostScreenMessage(
                Localizer.Format("#autoLOC_Screen_Seismic", energyFormat(crashEnergy), crashBody.GetDisplayName()),
                5.0f, ScreenMessageStyle.UPPER_RIGHT);


            return(data);
        }
Пример #5
0
 internal void addExperiment(ImpactScienceData newData)
 {
     //only replace if it is better than any existing results
     if (result == null || (newData.dataAmount > result.dataAmount && newData.kineticEnergy > result.kineticEnergy))
     {
         result = newData;
     }
 }
Пример #6
0
 public override void OnLoad(ConfigNode node)
 {
     if (node.HasNode("ScienceData"))
     {
         ConfigNode        storedDataNode = node.GetNode("ScienceData");
         ImpactScienceData data           = new ImpactScienceData(storedDataNode);
         result = data;
     }
 }
Пример #7
0
 internal void addExperiment(ImpactScienceData newData)
 {
     //only replace if it is better than any existing results
     if (result == null || newData.dataAmount > result.dataAmount)
     {
         ImpactMonitor.Log("Trying to save impact");
         result = newData;
     }
 }
Пример #8
0
 public override void OnLoad(ConfigNode node)
 {
     if (node.HasNode("ScienceData"))
     {
         ConfigNode storedDataNode = node.GetNode("ScienceData");
         ImpactScienceData data = new ImpactScienceData(storedDataNode);
         result=data;
     }
 }
Пример #9
0
 public static void OnSave(ConfigNode node, ImpactScienceData data)
 {
     node.RemoveNodes("ScienceData"); //** Prevent duplicates
     if (data != null)
     {
         ConfigNode storedDataNode = node.AddNode("ScienceData");
         data.SaveImpact(storedDataNode);
     }
 }
Пример #10
0
        private void OnBang(ImpactScienceData data)
        {
            if (isComplete)
            {
                ImpactCoordinator.getInstance().bangListeners.Remove(OnBang);
            }
            ImpactMonitor.Log("bang received in " + contract.expectedDataType + " parameter " + data.datatype);
            if (data.datatype != contract.expectedDataType)
            {
                return;
            }
            ScienceSubject subject = ResearchAndDevelopment.GetSubjectByID(data.subjectID);

            bool passed = false;

            switch (contract.expectedDataType)
            {
            case ImpactScienceData.DataTypes.Seismic:
                //check this was the right body and the impact was high enough energy
                passed = (subject.IsFromBody(contract.body) && data.kineticEnergy >= contract.energy);
                break;

            case ImpactScienceData.DataTypes.Spectral:
                //check it is the right body
                if (!subject.IsFromBody(contract.body))
                {
                    break;
                }
                //if a biome is specified  then check the biome matches
                ImpactMonitor.Log("Contract biome =" + contract.biome + " data biome =" + data.biome);
                ImpactMonitor.Log("Contract lat =" + contract.latitude + " data lat =" + data.latitude);
                if (contract.biome != null)
                {
                    passed = data.biome == contract.biome;
                }
                else
                {
                    passed = contract.latitude <= Math.Abs(data.latitude);
                }
                break;

            case ImpactScienceData.DataTypes.Asteroid:
                ImpactMonitor.Log("Contract astreroid =" + contract.asteroid + " data asteroid ="
                                  + data.asteroid + "data.datatype =" + data.datatype + " data asteroid =" + data.asteroid);
                passed = contract.asteroid == data.asteroid;
                break;
            }

            if (passed)
            {
                SetComplete();
                isComplete = true;
                ImpactCoordinator.getInstance().bangListeners.Remove(OnBang);
            }
        }
Пример #11
0
        private void orbitingVessel(CelestialBody crashBody, Vessel observer, Vessel crashVessel)
        {
            Log("And it is orbiting");
            Log("CelestialBody is at " + crashBody.position);
            Log("Crash vessel is at" + crashVessel.CoM);
            Log("Observer is at" + observer.CoM);
            Vector3d crash = crashVessel.CoM;

            crash = crashVessel.CoM - crashBody.position;
            Log("crashRelaticeTocentre =" + crash);
            Vector3d orbVec   = observer.CoM - crashBody.position;
            Vector3d sightVec = (orbVec - crash);
            double   angle    = Vector3d.Angle(crash, sightVec);

            Log("Sight=" + sightVec);
            Log("sight angle = " + angle + " degrees");
            Log("Distance between them =" + sightVec.magnitude);

            if (angle < 90)
            {
                Log("Vessel is visible");
                if (observer.loaded)
                {
                    List <Spectrometer> spectrometers = observer.FindPartModulesImplementing <Spectrometer>();
                    if (spectrometers.Count != 0)
                    {
                        Log("Found spectrometers");
                        ImpactScienceData data = createSpectralData(crashBody, crashVessel, spectrometers[0].part.flightID);
                        ImpactCoordinator.getInstance().bangListeners.Fire(data);
                        spectrometers[0].addExperiment(data);
                    }
                }
                else
                {
                    List <ProtoPartSnapshot> parts = observer.protoVessel.protoPartSnapshots;
                    foreach (ProtoPartSnapshot snap in parts)
                    {
                        foreach (ProtoPartModuleSnapshot mod in snap.modules)
                        {
                            if (mod.moduleName == "Spectrometer")
                            {
                                Log("Found spectrometers");
                                ImpactScienceData data = createSpectralData(crashBody, crashVessel, snap.flightID);
                                Log("about to call listeners");
                                ImpactCoordinator.getInstance().bangListeners.Fire(data);
                                Log("About to call newresult");
                                Spectrometer.NewResult(mod.moduleValues, data);
                                return;
                            }
                        }
                    }
                }
            }
        }
Пример #12
0
        public static void OnSave(ConfigNode node, ImpactScienceData data)
        {
            ImpactMonitor.Log("Saving spectrometerr");

            node.RemoveNodes("ScienceData"); //** Prevent duplicates
            if (data != null)
            {
                ConfigNode storedDataNode = node.AddNode("ScienceData");
                ImpactMonitor.Log("saving data");
                data.SaveImpact(storedDataNode);
            }
        }
Пример #13
0
 internal static void NewResult(ConfigNode node, ImpactScienceData newData)
 {
     //only replace if it is better than any existing results
     if (node.HasNode("ScienceData"))
     {
         ConfigNode        storedDataNode = node.GetNode("ScienceData");
         ImpactScienceData data           = new ImpactScienceData(storedDataNode);
         if (newData.dataAmount <= data.dataAmount)
         {
             ImpactMonitor.Log("Discarding because better data is already stored");
             return;
         }
     }
     OnSave(node, newData);
 }
Пример #14
0
 internal static void NewResult(ConfigNode node, ImpactScienceData newData)
 {
     //only replace if it is better than any existing results
     if (node.HasNode("ScienceData"))
     {
         ConfigNode storedDataNode = node.GetNode("ScienceData");
         ImpactMonitor.Log("loading data");
         ImpactScienceData data = new ImpactScienceData(storedDataNode);
         if (newData.dataAmount < data.dataAmount || newData.kineticEnergy < data.kineticEnergy)
         {
             return;
         }
     }
     OnSave(node, newData);
 }
Пример #15
0
        public void ReturnData(ScienceData data)
        {
            if (data != null)
            {
                if (result == null)
                {
                    result = data as ImpactScienceData;
                }
                else if (data.dataAmount > result.dataAmount && (data as ImpactScienceData).kineticEnergy > result.kineticEnergy)
                {
                    result = data as ImpactScienceData;
                }
            }

            return;
        }
Пример #16
0
        public void ReturnData(ScienceData data)
        {
            if (data != null)
            {
                if (result == null)
                {
                    result = data as ImpactScienceData;
                }
                else if (data.dataAmount > result.dataAmount)
                {
                    result = data as ImpactScienceData;
                }
            }

            return;
        }
Пример #17
0
        private void nearAsteroidVessel(Vessel observer, Vessel crashVessel, Vessel asteroid, CelestialBody crashBody)
        {
            Log("observer is orbiting ");
            Log("observer is at " + observer.CoM);
            Log("Crash vessel is at" + crashVessel.CoM);
            Vector3d sightVec = observer.CoM - crashVessel.CoM;

            Log("Distance between them =" + sightVec.magnitude);


            if (sightVec.magnitude < 5e5)
            {
                //observer is in range (500km)
                Log("It is in range =" + (sightVec).magnitude);
                if (observer.loaded)
                {
                    List <Spectrometer> spectrometers = observer.FindPartModulesImplementing <Spectrometer>();
                    if (spectrometers.Count != 0)
                    {
                        Log("Found loaded spectrometers");
                        ImpactScienceData data = createAsteroidSpectralData(crashBody, asteroid, crashVessel, spectrometers[0].part.flightID);
                        ImpactCoordinator.getInstance().bangListeners.Fire(data);
                        spectrometers[0].addExperiment(data);
                    }
                }
                else
                {
                    List <ProtoPartSnapshot> parts = observer.protoVessel.protoPartSnapshots;
                    foreach (ProtoPartSnapshot snap in parts)
                    {
                        foreach (ProtoPartModuleSnapshot mod in snap.modules)
                        {
                            if (mod.moduleName == "Spectrometer")
                            {
                                Log("Found unloaded spectrometers");
                                ImpactScienceData data = createAsteroidSpectralData(crashBody, asteroid, crashVessel, snap.flightID);
                                ImpactCoordinator.getInstance().bangListeners.Fire(data);
                                Spectrometer.NewResult(mod.moduleValues, data);
                                return;
                            }
                        }
                    }
                }
            }
        }
Пример #18
0
 public void scienceToKSC(ImpactScienceData data)
 {
     ImpactCoordinator.getInstance().scienceListeners.Fire(data);
 }
Пример #19
0
 public void DumpData(ScienceData data)
 {
     expDialog = null;
     result = null;
 }
Пример #20
0
        public void ReturnData(ScienceData data)
        {
            if (data != null) {
                if (result == null) {
                    result = data as ImpactScienceData;
                } else if(data.dataAmount > result.dataAmount) {
                    result = data as ImpactScienceData;
                }
            }

            return;
        }
Пример #21
0
 public void DumpData(ScienceData data)
 {
     expDialog = null;
     result    = null;
 }
Пример #22
0
 public void scienceToKSC(ImpactScienceData data)
 {
     ImpactCoordinator.getInstance().scienceListeners.Fire(data);
 }
Пример #23
0
        private static ImpactScienceData createSpectralData(CelestialBody crashBody, Vessel crashVessel, uint flightID)
        {
            double crashVelocity = crashVessel.srf_velocity.magnitude;
            Log("Velocity=" + crashVelocity);
            float crashMasss = crashVessel.GetTotalMass() * 1000;
            double crashEnergy = 0.5 * crashMasss * crashVelocity * crashVelocity; //KE of crash

            ScienceExperiment experiment = ResearchAndDevelopment.GetExperiment("ImpactSpectrometer");
            String biome = ScienceUtil.GetExperimentBiome(crashBody, crashVessel.latitude, crashVessel.longitude);
            CBAttributeMapSO m = crashBody.BiomeMap;
            CBAttributeMapSO.MapAttribute[] atts = m.Attributes;
            foreach (CBAttributeMapSO.MapAttribute att in atts)
            {
                Log("att=" + att.name+"-"+att.value);
            }
            ScienceSubject subject = ResearchAndDevelopment.GetExperimentSubject(experiment, ExperimentSituations.InSpaceLow, crashBody, biome);
            double science = subject.scienceCap;
            Log("Impact took place in " + biome + " at " + crashVessel.latitude + "," + crashVessel.longitude);
            String flavourText = "Impact at {0} on {1}";

            science = Math.Max(0, science - subject.science);
            science /= subject.subjectValue;

            ImpactScienceData data = new ImpactScienceData(ImpactScienceData.DataTypes.Spectral,
                0, biome, crashVessel.latitude,
                (float)(science * subject.dataScale), 1f, 0, subject.id,
                String.Format(flavourText, biome, crashBody.theName), false, flightID);

            ScreenMessages.PostScreenMessage(
                String.Format("Recorded spectrographic impact data at {0} on {1}", biome, crashBody.theName),
                5.0f, ScreenMessageStyle.UPPER_RIGHT);

            return data;
        }
Пример #24
0
        private static ImpactScienceData createSeismicData(CelestialBody crashBody, Vessel crashVessel, uint flightID)
        {
            double crashVelocity = crashVessel.srf_velocity.magnitude;
            Log("Velocity=" + crashVelocity);
            float crashMasss = crashVessel.GetTotalMass() * 1000;
            double crashEnergy = 0.5 * crashMasss * crashVelocity * crashVelocity; //KE of crash

            ScienceExperiment experiment = ResearchAndDevelopment.GetExperiment("ImpactSeismometer");
            ScienceSubject subject = ResearchAndDevelopment.GetExperimentSubject(experiment, ExperimentSituations.SrfLanded, crashBody, "");
            double science = translateKEToScience(crashEnergy, crashBody, subject);

            String flavourText = "Impact of {0} on {1}";
            Log(" caluculated science =" + science);
            science = Math.Max(0.01, science - subject.science);
            Log("residual science =" + science);

            science /= subject.subjectValue;
            Log("divided science =" + science);

            ImpactScienceData data = new ImpactScienceData(ImpactScienceData.DataTypes.Seismic,
                (float)crashEnergy, null, crashVessel.latitude,
                (float)(science * subject.dataScale), 1f, 0, subject.id,
                String.Format(flavourText, energyFormat(crashEnergy), crashBody.theName), false, flightID);

            ScreenMessages.PostScreenMessage(
                String.Format("Recorded seismic impact of {0} on {1}",energyFormat(crashEnergy), crashBody.theName),
                5.0f, ScreenMessageStyle.UPPER_RIGHT);

            return data;
        }
Пример #25
0
        private static ImpactScienceData createAsteroidSpectralData(CelestialBody crashBody, Vessel asteroid, Vessel crashVessel, uint flightID)
        {
            double crashVelocity = crashVessel.srf_velocity.magnitude;
            Log("Velocity=" + crashVelocity);
            float crashMasss = crashVessel.GetTotalMass() * 1000;
            double crashEnergy = 0.5 * crashMasss * crashVelocity * crashVelocity; //KE of crash

            ScienceExperiment experiment = ResearchAndDevelopment.GetExperiment("AsteroidSpectometry");
            ExperimentSituations situation = ScienceUtil.GetExperimentSituation(asteroid);

            ScienceSubject subject = ResearchAndDevelopment.GetExperimentSubject(experiment, situation, asteroid.id.ToString(), asteroid.GetName(), crashBody, "");
            double science = subject.scienceCap;
            Log("Impact took place in " + situation);
            String flavourText = "Impact at {0} on {1}";

            science /= subject.subjectValue;

            ImpactScienceData data = new ImpactScienceData(0, asteroid.GetName(),
                (float)(science * subject.dataScale), 1f, 0, subject.id,
                String.Format(flavourText, asteroid.GetName(), crashBody.theName), false, flightID);

            ScreenMessages.PostScreenMessage(
                String.Format("Recorded spectrographic impact data at {0} around {1}", asteroid.GetName(), crashBody.theName),
                5.0f, ScreenMessageStyle.UPPER_RIGHT);

            return data;
        }
Пример #26
0
 internal void addExperiment(ImpactScienceData newData)
 {
     //only replace if it is better than any existing results
     if (result!=null && newData.dataAmount > result.dataAmount)
     {
         result = newData;
     }
 }
Пример #27
0
        public void ReturnData(ScienceData data)
        {
            if (data != null) {
                if (result == null) {
                    result = data as ImpactScienceData;
                } else if(data.dataAmount > result.dataAmount && (data as ImpactScienceData).kineticEnergy > result.kineticEnergy) {
                    result = data as ImpactScienceData;
                }
            }

            return;
        }
Пример #28
0
 internal static void NewResult(ConfigNode node, ImpactScienceData newData)
 {
     //only replace if it is better than any existing results
     if (node.HasNode("ScienceData"))
     {
         ConfigNode storedDataNode = node.GetNode("ScienceData");
         ImpactMonitor.Log("loading data");
         ImpactScienceData data = new ImpactScienceData(storedDataNode);
         if (newData.dataAmount < data.dataAmount || newData.kineticEnergy < data.kineticEnergy)
         {
             return;
         }
     }
     OnSave(node, newData);
 }
Пример #29
0
        internal static void NewResult(ConfigNode node, ImpactScienceData newData)
        {
            //only replace if it is better than any existing results
            if (node.HasNode("ScienceData"))
            {
                ConfigNode storedDataNode = node.GetNode("ScienceData");
                ImpactMonitor.Log("loading data");
                ImpactScienceData data = new ImpactScienceData(storedDataNode);
                if (newData.dataAmount <= data.dataAmount)
                {
                    ImpactMonitor.Log("Discarding because better data is already stored");

                    return;
                }
            }
            OnSave(node, newData);
        }