/// <summary> /// Get the ScienceSubject for an asteroid experiment. /// </summary> /// <param name="mse">The science experiment module must be cast as a ModuleScienceExperiment.</param> /// <param name="sit">The current Experiment Situation value; see the getExperimentSituation method above.</param> /// <returns>Returns the ScienceSubject for that specific asteroid, experiment, and ExperimentSituation; returns null if the module is not of the right type, the experiment is not suitable for astroids, if no asteroids are detected, or if the current asteroid situation is not suitable for the experiment.</returns> public static ScienceSubject getAsteroidSubject(ModuleScienceExperiment mse, ExperimentSituations sit) { if (mse == null) { return(null); } Type t = mse.GetType(); if (t != typeof(DMModuleScienceAnimateGeneric_NM.DMModuleScienceAnimateGeneric)) { return(null); } DMModuleScienceAnimateGeneric_NM.DMModuleScienceAnimateGeneric DMMod = (DMModuleScienceAnimateGeneric_NM.DMModuleScienceAnimateGeneric)mse; if (!isAsteroidExperiment(DMMod)) { return(null); } if (DMMod.scienceExp == null) { return(null); } if (sit == ExperimentSituations.InSpaceLow) { if (!isAsteroidNear()) { return(null); } } else if (sit == ExperimentSituations.SrfLanded) { if (!isAsteroidGrappled()) { return(null); } } else { return(null); } if ((DMMod.scienceExp.situationMask & (int)sit) == 0) { return(null); } string oldBodyName = FlightGlobals.Bodies[16].bodyName; DMAsteroidScienceGen newAsteroid = new DMAsteroidScienceGen(); ScienceSubject sub = new ScienceSubject(DMMod.scienceExp, sit, newAsteroid.Body, newAsteroid.AClass); sub.subjectValue = newAsteroid.SciMult; sub.scienceCap = DMMod.scienceExp.scienceCap * sub.subjectValue; newAsteroid.Body.bodyName = oldBodyName; return(sub); }
//Create the science data public ScienceData makeScience() { ExperimentSituations vesselSituation = getSituation(); string biome = getBiome(vesselSituation); CelestialBody mainBody = vessel.mainBody; DMAsteroidScienceGen newAsteroid = null; bool asteroid = false; //Check for asteroids and alter the biome and celestialbody values as necessary if (asteroidReports && (DMAsteroidScienceGen.AsteroidGrappled || DMAsteroidScienceGen.AsteroidNear)) { bodyNameFixed = FlightGlobals.Bodies[16].bodyName; newAsteroid = new DMAsteroidScienceGen(); mainBody = newAsteroid.Body; biome = newAsteroid.AClass; asteroid = true; } ScienceData data = null; ScienceSubject sub = ResearchAndDevelopment.GetExperimentSubject(scienceExp, vesselSituation, mainBody, biome); sub.title = scienceExp.experimentTitle + situationCleanup(vesselSituation, biome); if (asteroid) { sub.subjectValue = newAsteroid.SciMult; sub.scienceCap = scienceExp.scienceCap * sub.subjectValue; mainBody.bodyName = bodyNameFixed; asteroid = false; } if (sub != null) data = new ScienceData(scienceExp.baseValue * sub.dataScale, xmitDataScalar, vessel.VesselValues.ScienceReturn.value, sub.id, sub.title, false, part.flightID); return data; }