private double GenerateRadius(MoonCategory category, Planet parentPlanet)
        {
            Random random = new Random(DateTime.Now.Millisecond);
            double radius;

            switch (category)
            {
            case MoonCategory.Small:
                radius = parentPlanet.Radius * (random.Next(1, 20) / 10000F);
                break;

            case MoonCategory.Medium:
                radius = parentPlanet.Radius * (random.Next(21, 2500) / 10000F);
                break;

            case MoonCategory.Large:
                radius = parentPlanet.Radius * (random.Next(2501, 7500) / 10000F);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(category), category, null);
            }

            return(radius);
        }
        public Moon(char moonId, string moonName, string moonDescription, Planet parentPlanet, float kilometersFromParent = -1)
        {
            Universe.MoonCount++;
            Id          = moonId;
            Name        = moonName;
            Description = moonDescription;
            Random       random       = new Random(DateTime.Now.Millisecond);
            MoonCategory moonCategory = PickMoonCategory();

            Radius = GenerateRadius(moonCategory, parentPlanet);
            KilometersFromParent  = kilometersFromParent == -1 ? DetermineDistanceFromParentBody(parentPlanet.Radius, Radius) : kilometersFromParent;
            AverageDensity        = parentPlanet.AverageDensity;
            BaseTemperature       = parentPlanet.BaseTemperature;
            ResourcesPresent      = parentPlanet.ResourcesPresent;
            SolarInsolation       = parentPlanet.SolarInsolation;
            AxialTilt             = 0;
            GeologicActivityLevel = 0;
            //RotationalPeriod = ;
            Volume  = CalculateVolume(Radius);
            Mass    = CalculateMass(Volume, AverageDensity);
            Gravity = CalculateGravity(Mass, Radius);

            switch (moonCategory)
            {
            case MoonCategory.Small:
                CalculateBarrenMoonProperties(this);
                break;

            case MoonCategory.Medium:
                if (random.Next(0, 100) > 65)
                {
                    CalculateAtmosphericMoonProperties(this);
                }
                else
                {
                    CalculateBarrenMoonProperties(this);
                }
                break;

            case MoonCategory.Large:
                if (random.Next(0, 100) > 10)
                {
                    CalculateAtmosphericMoonProperties(this);
                }
                else
                {
                    CalculateBarrenMoonProperties(this);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            AverageSurfaceTemperature = CalculateInitialSurfaceTemperature(BaseTemperature, GreenhouseModifier);

            ResourcesByState = CalculateResourceStates(ResourcesPresent, AverageSurfaceTemperature);    //Todo: Clean this up!!! Please!!! Seems redundant to pass the ResourcesByState object to the method only to place the passed object right back into itself. (objects are pass by reference...)

            if (AtmosphericDensity > 0)
            {
                ResourcesByState.Atmospherics = CalculateResourceAbundance(ResourcesByState.Atmospherics);
                CalculateAtmosphericDensity(ResourcesByState.Atmospherics);
            }
            else
            {
                ResourcesByState.Atmospherics = null;
            }

            ResourcesByState.Liquids = CalculateResourceAbundance(ResourcesByState.Liquids);
            ResourcesByState.Solids  = CalculateResourceAbundance(ResourcesByState.Solids);
        }