Example #1
0
        public void TestAddOrUpdateBodyUpdate()
        {
            StarSystem starSystem = new StarSystem()
            {
                systemname = "testSystem"
            };
            Body body = new Body()
            {
                bodyname = "testSystem 1"
            };

            starSystem.AddOrUpdateBody(body);
            BodyType moon        = BodyType.FromEDName("Moon");
            Body     updatedBody = new Body()
            {
                bodyname = "testSystem 1", bodyType = moon
            };

            starSystem.AddOrUpdateBody(updatedBody);

            Assert.AreEqual(1, starSystem.bodies.Count);
            Body actualBody = starSystem.bodies[0];

            Assert.AreEqual("testSystem 1", actualBody.bodyname);
            Assert.AreEqual(moon, actualBody.bodyType);
        }
Example #2
0
        private static Body ParseEddbBody(object response)
        {
            JObject bodyJson = ((JObject)response);

            Body Body = new Body
            {
                // General items
                EDDBID       = (long)bodyJson["id"],
                updatedat    = (long)(Dates.fromDateTimeStringToSeconds((string)bodyJson["updated_at"])),
                name         = (string)bodyJson["name"],
                Type         = BodyType.FromEDName((string)bodyJson["group_name"]),
                systemEDDBID = (long)bodyJson["system_id"],

                // Orbital data
                distance         = (decimal?)bodyJson["distance_to_arrival"],                                // Light seconds
                temperature      = (decimal?)bodyJson["surface_temperature"],                                //Kelvin
                tidallylocked    = (bool?)bodyJson["is_rotational_period_tidally_locked"] ?? false,          // Days
                rotationalperiod = (decimal?)(double?)bodyJson["rotational_period"],                         // Days
                tilt             = (decimal?)(double?)bodyJson["axis_tilt"],                                 // Degrees
                semimajoraxis    = ConstantConverters.au2ls((decimal?)(double?)bodyJson["semi_major_axis"]), // Light Seconds
                orbitalperiod    = (decimal?)(double?)bodyJson["orbital_period"],                            // Days
                periapsis        = (decimal?)(double?)bodyJson["arg_of_periapsis"],                          // Degrees
                eccentricity     = (decimal?)(double?)bodyJson["orbital_eccentricity"],
                inclination      = (decimal?)(double?)bodyJson["orbital_inclination"]                        // Degrees
            };

            if ((string)bodyJson["group_name"] == "belt")
            {
                // Not interested in asteroid belts,
                // no need to add additional information at this time.
            }

            else if ((string)bodyJson["group_name"] == "star")
            {
                // Star-specific items
                Body.stellarclass    = ((string)bodyJson["spectral_class"])?.ToUpperInvariant();
                Body.luminosityclass = ((string)bodyJson["luminosity_class"])?.ToUpperInvariant();
                Body.solarmass       = (decimal?)(double?)bodyJson["solar_masses"];
                Body.solarradius     = (decimal?)(double?)bodyJson["solar_radius"];
                Body.age             = (long?)bodyJson["age"]; // MegaYears
                Body.mainstar        = (bool?)bodyJson["is_main_star"];
                Body.landable        = false;
                Body.setStellarExtras();
            }

            else if ((string)bodyJson["group_name"] == "planet")
            {
                // Planet-specific items
                Body.planetClass    = PlanetClass.FromEDName((string)bodyJson["type_name"]);
                Body.landable       = (bool?)bodyJson["is_landable"] ?? false;
                Body.earthmass      = (decimal?)(double?)bodyJson["earth_masses"];
                Body.gravity        = (decimal?)(double?)bodyJson["gravity"]; // G's
                Body.radius         = (decimal?)bodyJson["radius"];           // Kilometers
                Body.pressure       = (decimal?)(double?)bodyJson["surface_pressure"] ?? 0;
                Body.terraformState = TerraformState.FromName((string)bodyJson["terraforming_state_name"]);
                // Per Themroc @ EDDB, "Major" and "Minor" volcanism descriptors are stripped from EDDB data.
                Body.volcanism       = Volcanism.FromName((string)bodyJson["volcanism_type_name"]);
                Body.atmosphereclass = AtmosphereClass.FromName((string)bodyJson["atmosphere_type_name"]);
                if (bodyJson["atmosphere_composition"] != null)
                {
                    List <AtmosphereComposition> atmosphereCompositions = new List <AtmosphereComposition>();
                    foreach (JObject atmoJson in bodyJson["atmosphere_composition"])
                    {
                        string  composition = (string)atmoJson["atmosphere_component_name"];
                        decimal?share       = (decimal?)atmoJson["share"];
                        if (composition != null && share != null)
                        {
                            atmosphereCompositions.Add(new AtmosphereComposition(composition, (decimal)share));
                        }
                    }
                    if (atmosphereCompositions.Count > 0)
                    {
                        atmosphereCompositions      = atmosphereCompositions.OrderByDescending(x => x.percent).ToList();
                        Body.atmospherecompositions = atmosphereCompositions;
                    }
                }
                if (bodyJson["solid_composition"] != null)
                {
                    List <SolidComposition> bodyCompositions = new List <SolidComposition>();
                    foreach (JObject bodyCompJson in bodyJson["solid_composition"])
                    {
                        string  composition = (string)bodyCompJson["solid_component_name"];
                        decimal?share       = (decimal?)bodyCompJson["share"];
                        if (composition != null && share != null)
                        {
                            bodyCompositions.Add(new SolidComposition(composition, (decimal)share));
                        }
                    }
                    if (bodyCompositions.Count > 0)
                    {
                        bodyCompositions       = bodyCompositions.OrderByDescending(x => x.percent).ToList();
                        Body.solidcompositions = bodyCompositions;
                    }
                }
                if (bodyJson["materials"] != null)
                {
                    List <MaterialPresence> Materials = new List <MaterialPresence>();
                    foreach (JObject materialJson in bodyJson["materials"])
                    {
                        Material material = Material.FromEDName((string)materialJson["material_name"]);
                        decimal? amount   = (decimal?)(double?)materialJson["share"];
                        if (material != null && amount != null)
                        {
                            Materials.Add(new MaterialPresence(material, (decimal)amount));
                        }
                    }
                    if (Materials.Count > 0)
                    {
                        Body.materials = Materials.OrderByDescending(o => o.percentage).ToList();
                    }
                }
            }

            // Rings may be an object or may be a singular
            List <Ring> rings = new List <Ring>();

            if (bodyJson["rings"] != null)
            {
                foreach (JObject ringJson in bodyJson["rings"])
                {
                    string          name             = (string)ringJson["name"];
                    RingComposition composition      = RingComposition.FromName((string)ringJson["ring_type_name"]);
                    decimal         ringMassMegaTons = (decimal)ringJson["ring_mass"];
                    decimal         innerRadiusKm    = (decimal)ringJson["ring_inner_radius"];
                    decimal         outerRadiusKm    = (decimal)ringJson["ring_outer_radius"];
                    Ring            ring             = new Ring(name, composition, ringMassMegaTons, innerRadiusKm, outerRadiusKm);
                    rings.Add(ring);
                }
            }
            if (bodyJson["ring_type_name"].HasValues)
            {
                string          name             = (string)bodyJson["name"];
                RingComposition composition      = RingComposition.FromName((string)bodyJson["ring_type_name"]);
                decimal         ringMassMegaTons = (decimal)bodyJson["ring_mass"];
                decimal         innerRadiusKm    = (decimal)bodyJson["ring_inner_radius"];
                decimal         outerRadiusKm    = (decimal)bodyJson["ring_outer_radius"];
                Ring            ring             = new Ring(name, composition, ringMassMegaTons, innerRadiusKm, outerRadiusKm);
                rings.Add(ring);
            }
            if (rings.Count > 0)
            {
                Body.rings = rings.OrderBy(o => o.innerradius).ToList();
            }

            return(Body);
        }
Example #3
0
        public StarSystem ParseStarMapSystem(JObject response)
        {
            StarSystem starSystem = new StarSystem
            {
                systemname    = (string)response["name"],
                systemAddress = (long?)response["id64"],
                EDSMID        = (long?)response["id"]
            };

            if (response["coords"] is JObject)
            {
                var coords = response["coords"].ToObject <Dictionary <string, decimal?> >();
                starSystem.x = coords["x"];
                starSystem.y = coords["y"];
                starSystem.z = coords["z"];
            }

            if (response["primaryStar"] is JObject primarystar)
            {
                Body primaryStar = new Body()
                {
                    bodyname     = (string)primarystar["name"],
                    bodyType     = BodyType.FromEDName("Star"),
                    distance     = 0,
                    stellarclass = ((string)primarystar["type"])?.Split(' ')[0]
                };
                starSystem.AddOrUpdateBody(primaryStar);
            }

            if ((bool?)response["requirePermit"] is true)
            {
                starSystem.requirespermit = true;
                starSystem.permitname     = (string)response["permitName"];
            }

            if (response["information"] is JObject information)
            {
                starSystem.Reserve    = ReserveLevel.FromName((string)information["reserve"]) ?? ReserveLevel.None;
                starSystem.population = (long?)information["population"] ?? 0;

                // Populated system data
                if (starSystem.population > 0)
                {
                    Faction controllingFaction = new Faction
                    {
                        name       = (string)information["faction"],
                        Allegiance = Superpower.FromName((string)information["allegiance"]) ?? Superpower.None,
                        Government = Government.FromName((string)information["government"]) ?? Government.None,
                    };
                    controllingFaction.presences.Add(new FactionPresence()
                    {
                        systemName   = starSystem.systemname,
                        FactionState = FactionState.FromName((string)information["factionState"]) ?? FactionState.None,
                    });
                    starSystem.Faction = controllingFaction;

                    starSystem.securityLevel = SecurityLevel.FromName((string)information["security"]) ?? SecurityLevel.None;
                    starSystem.Economies     = new List <Economy>()
                    {
                        Economy.FromName((string)information["economy"]) ?? Economy.None,
                        Economy.FromName((string)information["secondEconomy"]) ?? Economy.None
                    };
                }
            }

            starSystem.lastupdated = DateTime.UtcNow;
            return(starSystem);
        }