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); }
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; } } } } }
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); }
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); }
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; } }
public override void OnLoad(ConfigNode node) { if (node.HasNode("ScienceData")) { ConfigNode storedDataNode = node.GetNode("ScienceData"); ImpactScienceData data = new ImpactScienceData(storedDataNode); result = data; } }
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; } }
public override void OnLoad(ConfigNode node) { if (node.HasNode("ScienceData")) { ConfigNode storedDataNode = node.GetNode("ScienceData"); ImpactScienceData data = new ImpactScienceData(storedDataNode); result=data; } }
public static void OnSave(ConfigNode node, ImpactScienceData data) { node.RemoveNodes("ScienceData"); //** Prevent duplicates if (data != null) { ConfigNode storedDataNode = node.AddNode("ScienceData"); data.SaveImpact(storedDataNode); } }
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); } }
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; } } } } } }
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); } }
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); }
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); }
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; }
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; }
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; } } } } } }
public void scienceToKSC(ImpactScienceData data) { ImpactCoordinator.getInstance().scienceListeners.Fire(data); }
public void DumpData(ScienceData data) { expDialog = null; result = null; }
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; }
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; }
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; }
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; }
internal void addExperiment(ImpactScienceData newData) { //only replace if it is better than any existing results if (result!=null && newData.dataAmount > result.dataAmount) { result = newData; } }
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; }
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); }