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));
        }
Ejemplo n.º 2
0
 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);
         }
     }
 }
Ejemplo n.º 3
0
 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);
         }
     }
 }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        private void removeSensors(DMSeismometerValues hammer, DMSeismometerValues pod)
        {
            hammer.removeSensor(pod.ID);

            pod.removeSensor(hammer.ID);
        }
Ejemplo n.º 6
0
        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();
            }
        }
Ejemplo n.º 7
0
        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;
                }
            }
        }