public static ScienceData makeData(DMSeismometerValues sensor, float score, ScienceExperiment exp, string expID, bool seismometerOnly, bool asteroid) { if (sensor == null || exp == null || sensor.VesselRef == null || sensor.VesselRef.mainBody == null) { return(null); } Vessel v = sensor.VesselRef; CelestialBody body = v.mainBody; string biome = ((int)exp.biomeMask & (int)ExperimentSituations.SrfLanded) == 0 ? "" : ScienceUtil.GetExperimentBiome(body, v.latitude, v.longitude); DMAsteroidScience newAsteroid = null; if (asteroid) { newAsteroid = new DMAsteroidScience(); body = newAsteroid.Body; biome = newAsteroid.AType + newAsteroid.ASeed.ToString(); } ScienceSubject sub = ResearchAndDevelopment.GetExperimentSubject(exp, ExperimentSituations.SrfLanded, body, biome); if (sub == null) { Debug.LogError("[DM] Something Went Wrong Here; Null Seismometer Subject Returned; Please Report This On The KSP Forum With Output.log Data"); return(null); } float science = exp.baseValue * sub.dataScale * score; if (asteroid) { body.bodyName = bodyNameFixed; DMUtils.OnAsteroidScience.Fire(newAsteroid.AClass, expID); sub.title = exp.experimentTitle + string.Format(" from the surface of a {0} asteroid", newAsteroid.AType); registerDMScience(newAsteroid, exp, sub); } else { if (sub.science > 0) { sub.scientificValue = 1f; if (sub.science >= ((science / sub.dataScale) * sub.subjectValue)) { sub.scientificValue = 0f; } else { sub.scientificValue = 1 - ((sub.science / sub.subjectValue) / (science / sub.dataScale)); } } DMUtils.OnAnomalyScience.Fire(body, expID, biome); sub.title = exp.experimentTitle + string.Format(" from {0}'s {1}", body.theName, biome); } return(new ScienceData(science, 1f, 1f, sub.id, sub.title, false, sensor.ID)); }
public void addProtoSeismometer(uint id, ProtoPartSnapshot pp, ProtoPartModuleSnapshot pm) { if (pm.moduleName == "DMSeismicSensor") { if (!seismometers.ContainsKey(id)) { DMSeismometerValues v = new DMSeismometerValues(pp.pVesselRef.vesselRef, pp, pm, false); seismometers.Add(id, v); } } else if (pm.moduleName == "DMSeismicHammer") { if (!hammers.ContainsKey(id)) { DMSeismometerValues v = new DMSeismometerValues(pp.pVesselRef.vesselRef, pp, pm, true); hammers.Add(id, v); } } }
public void addLoadedSeismometer(uint id, IDMSeismometer sensor) { if (sensor.GetType() == typeof(DMSeismicSensor)) { if (!seismometers.ContainsKey(id)) { DMSeismicSensor s = (DMSeismicSensor)sensor; DMSeismometerValues v = new DMSeismometerValues(s.vessel, s.part.protoPartSnapshot, s.snapshot, false); seismometers.Add(id, v); } } else if (sensor.GetType() == typeof(DMSeismicHammer)) { if (!hammers.ContainsKey(id)) { DMSeismicHammer h = (DMSeismicHammer)sensor; DMSeismometerValues v = new DMSeismometerValues(h.vessel, h.part.protoPartSnapshot, h.snapshot, true); hammers.Add(id, v); } } }
public DMSeismometerValues getBestHammer() { if (nearbySensors.Count <= 0) { return(this); } else { DMSeismometerValues bestHammer = null; float highScore = baseScore; for (int i = 0; i < nearbySensors.Count; i++) { uint id = nearbySensors.ElementAt(i).Key; DMSeismometerValues h = DMSeismicHandler.Instance.getSeismicHammer(id); if (h == null) { continue; } if (bestHammer == null) { bestHammer = h; } if (h.score > bestHammer.score) { bestHammer = h; } } return(bestHammer); } }
private void removeSensors(DMSeismometerValues hammer, DMSeismometerValues pod) { hammer.removeSensor(pod.ID); pod.removeSensor(hammer.ID); }
private void updatePositions() { for (int i = 0; i < hammers.Count; i++) { DMSeismometerValues h = hammers.ElementAt(i).Value; if (h == null) { continue; } if (!h.Hammer) { h.removeAllSensors(); continue; } if (!h.Armed) { h.removeAllSensors(); continue; } if (h.ProtoPartRef == null) { h.removeAllSensors(); h.updateScore(); continue; } if (h.VesselRef == null) { h.removeAllSensors(); h.updateScore(); continue; } if (!h.VesselRef.LandedOrSplashed) { h.removeAllSensors(); h.updateScore(); continue; } for (int j = 0; j < seismometers.Count; j++) { DMSeismometerValues s = seismometers.ElementAt(j).Value; if (s == null) { continue; } if (s.Hammer) { removeSensors(h, s); continue; } if (!s.Armed) { removeSensors(h, s); continue; } if (s.ProtoPartRef == null) { removeSensors(h, s); continue; } if (s.VesselRef == null) { removeSensors(h, s); continue; } if (!s.VesselRef.LandedOrSplashed) { removeSensors(h, s); continue; } if (s.VesselRef == h.VesselRef) { removeSensors(h, s); continue; } double distance = Math.Abs((h.VesselRef.GetWorldPos3D() - s.VesselRef.GetWorldPos3D()).magnitude); if (distance > farPodMaxDistance + 1000) { removeSensors(h, s); continue; } else if (distance < farPodMaxDistance) { float angle = (float)DMUtils.bearing(h.VesselRef.latitude, h.VesselRef.longitude, s.VesselRef.latitude, s.VesselRef.longitude); h.addSensor(s.ID, new Vector2((float)distance, angle)); s.addSensor(h.ID, new Vector2()); } } h.updateScore(); } for (int j = 0; j < seismometers.Count; j++) { DMSeismometerValues s = seismometers.ElementAt(j).Value; if (s == null) { continue; } if (s.Hammer) { continue; } if (!s.Armed) { continue; } s.updateScore(); } }
public void updateScore() { if (hammer) { if (onAsteroid) { if (vesselRef.loaded && vesselRef.FindPartModulesImplementing <DMSeismicSensor>().Count > 0) { score = 1f; return; } else { score = baseScore; return; } } if (nearbySensors.Count <= 0) { score = baseScore; return; } if (nearbySensors.Count >= 5) { if (nearbySensors.Where(s => s.Value.x > 10).Count() >= 2) { score = 1f; return; } } float nearbySensorBaseScore = Math.Min(0.2f, 0.1f * nearbySensors.Count); float nearSensorScore = 0f; float?nearSensorAngle = null; float farSensorScore = 0f; float?farSensorAngle = null; for (int i = 0; i < nearbySensors.Count; i++) { Vector2 v = nearbySensors.ElementAt(i).Value; if (v.x < DMSeismicHandler.nearPodMaxDistance) { float distanceScore = 0f; float angleScore = 0f; if (v.x < DMSeismicHandler.nearPodMinDistance) { distanceScore = 0f; angleScore = 0f; } else { if (v.x < DMSeismicHandler.nearPodThreshold) { distanceScore = ((v.x - DMSeismicHandler.nearPodMinDistance) / (DMSeismicHandler.nearPodThreshold - DMSeismicHandler.nearPodMinDistance)) * 0.15f; } else if (v.x >= DMSeismicHandler.nearPodThreshold) { distanceScore = 0.15f; } if (farSensorAngle == null) { angleScore = 0.05f; } else { float angleDelta = Math.Abs(angleDifference(v.y, (float)farSensorAngle)); if (angleDelta < DMSeismicHandler.podMinAngle) { angleScore = 0f; } else if (angleDelta < DMSeismicHandler.podAngleThreshold) { angleScore = ((angleDelta - DMSeismicHandler.podMinAngle) / (DMSeismicHandler.podAngleThreshold - DMSeismicHandler.podMinAngle)) * 0.05f; } else { angleScore = 0.05f; } } } float totalScore = distanceScore + angleScore; if (totalScore > nearSensorScore) { nearSensorScore = totalScore; nearSensorAngle = v.y; } } else { float distanceScore = 0f; float angleScore = 0f; if (v.x < DMSeismicHandler.farPodThreshold) { distanceScore = ((v.x - DMSeismicHandler.farPodMinDistance) / (DMSeismicHandler.farPodThreshold - DMSeismicHandler.farPodMinDistance)) * 0.15f; } else { distanceScore = 0.15f; } if (nearSensorAngle == null) { angleScore = 0.05f; } else { float angleDelta = Math.Abs(angleDifference(v.y, (float)nearSensorAngle)); if (angleDelta < DMSeismicHandler.podMinAngle) { angleScore = 0f; } else if (angleDelta < DMSeismicHandler.podAngleThreshold) { angleScore = ((angleDelta - DMSeismicHandler.podMinAngle) / (DMSeismicHandler.podAngleThreshold - DMSeismicHandler.podMinAngle)) * 0.05f; } else { angleScore = 0.05f; } } float totalScore = distanceScore + angleScore; if (totalScore > farSensorScore) { farSensorScore = totalScore; farSensorAngle = v.y; } } score = Mathf.Clamp(baseScore + nearbySensorBaseScore + nearSensorScore + farSensorScore, 0f, 1f); } } else { if (onAsteroid) { if (vesselRef.loaded && vesselRef.FindPartModulesImplementing <DMSeismicHammer>().Count > 0) { score = 1f; return; } else { score = baseScore; return; } } if (nearbySensors.Count <= 0) { score = baseScore; } else { float highScore = baseScore; for (int i = 0; i < nearbySensors.Count; i++) { uint id = nearbySensors.ElementAt(i).Key; DMSeismometerValues h = DMSeismicHandler.Instance.getSeismicHammer(id); if (h == null) { continue; } if (h.score > highScore) { highScore = h.score; } } score = highScore; } } }