Пример #1
0
        public WeatherRangeData(HemisphereTypes hemisphere, SeasonTypes season, ClimateTypes climate)
        {
            Temperature   = new List <int>();
            Pressure      = new List <int>();
            CloudCover    = new List <int>();
            Humidity      = new List <int>();
            Precipitation = new List <int>();
            Energy        = new List <int>();
            WindSpeedX    = new List <int>();
            WindSpeedY    = new List <int>();

            Hemisphere = hemisphere;
            Season     = season;
            Climate    = climate;
        }
 public override void ResetVariables()
 {
     base.ResetVariables();
     _body                   = "";
     _bodyValue              = 0;
     _gravity                = "";
     _atmosphericPresence    = "";
     _hasAtmosphere          = false;
     _atmosphericComposition = "";
     _atmosphereTainted      = false;
     _atmospherePure         = false;
     _climate                = "";
     _habitabiliy            = Habitabiliy.Inhospitable;
     _orbitalFeaturesNode    = null;
     _nativeSpeciesNode      = null;
     _primitiveXenosNode     = null;
     _numContinents          = 0;
     _numIslands             = 0;
     _environment            = null;
     ClimateType             = ClimateTypes.Undefined;
     AtmosphereType          = AtmosphereTypes.Undefined;
     _forceInhabitable       = false;
     _isInhabitantHomeWorld  = false;
 }
        public override void Generate()
        {
            _primitiveXenosNode = new PrimitiveXenosNode(_systemCreationRules)
            {
                Parent = this
            };
            Children.Add(_primitiveXenosNode);
            _nativeSpeciesNode = new NativeSpeciesNode(_systemCreationRules)
            {
                Parent = this
            };
            Children.Add(_nativeSpeciesNode);

            NodeBase zoneNode = Parent;

            while (!(zoneNode is ZoneNode))
            {
                zoneNode = zoneNode.Parent;
            }
            _effectiveSystemZone = (zoneNode as ZoneNode).Zone;
            if (_effectiveSystemZoneCloserToSun)
            {
                switch (_effectiveSystemZone)
                {
                case SystemZone.InnerCauldron:
                    break;

                case SystemZone.PrimaryBiosphere:
                    _effectiveSystemZone = SystemZone.InnerCauldron;
                    break;

                case SystemZone.OuterReaches:
                    _effectiveSystemZone = SystemZone.PrimaryBiosphere;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            int gravityRollModifier = 0;
            EffectivePlanetSize effectivePlanetSize = EffectivePlanetSize.Small;
            int maximumMineralResourceAbundance     = -1;
            int mineralResourceAbundanceModifier    = 0;
            int orbitalFeaturesModifier             = 0;
            int atmosphericPresenceModifier         = 0;
            int atmosphericCompositionModifier      = 0;
            int habitabilityModifier = 0;
            int maxHabitabilityRoll  = 9999;

            // Generate Body
            int randValue = Globals.RollD10();

            if (randValue > _maxSize)
            {
                randValue = _maxSize;
            }
            switch (randValue)
            {
            case 1:
                _body = "Low-Mass";
                gravityRollModifier            -= 7;
                effectivePlanetSize             = EffectivePlanetSize.Small;
                maximumMineralResourceAbundance = 40;
                break;

            case 2:
            case 3:
                _body = "Small";
                gravityRollModifier -= 5;
                effectivePlanetSize  = EffectivePlanetSize.Small;
                break;

            case 4:
                _body = "Small and Dense";
                effectivePlanetSize = EffectivePlanetSize.Small;
                mineralResourceAbundanceModifier += 10;
                break;

            case 5:
            case 6:
            case 7:
                _body = "Large";
                effectivePlanetSize = EffectivePlanetSize.Large;
                break;

            case 8:
                _body = "Large and Dense";
                effectivePlanetSize  = EffectivePlanetSize.Large;
                gravityRollModifier += 5;
                mineralResourceAbundanceModifier += 10;
                break;

            case 9:
            case 10:
                _body = "Vast";
                effectivePlanetSize  = EffectivePlanetSize.Vast;
                gravityRollModifier += 4;
                break;
            }
            _bodyValue = randValue;

            int numOrbitalFeaturesToGenerate;

            // Generate Gravity
            randValue = Globals.RollD10() + gravityRollModifier;
            if (randValue <= 2)
            {
                _gravity = "Low";
                orbitalFeaturesModifier     -= 10;
                atmosphericPresenceModifier -= 2;
                numOrbitalFeaturesToGenerate = Globals.RollD5() - 3;
            }
            else if (randValue <= 8)
            {
                _gravity = "Normal";
                numOrbitalFeaturesToGenerate = Globals.RollD5() - 2;
            }
            else
            {
                _gravity = "High";
                orbitalFeaturesModifier     += 10;
                atmosphericPresenceModifier += 1;
                numOrbitalFeaturesToGenerate = Globals.RollD5() - 1;
            }

            if (numOrbitalFeaturesToGenerate < 1)
            {
                numOrbitalFeaturesToGenerate = 1;
            }
            if (_isMoon)
            {
                numOrbitalFeaturesToGenerate = 0;
            }

            // Generate Orbital Features
            for (int i = 0; i < numOrbitalFeaturesToGenerate; i++)
            {
                randValue = Globals.RollD100() + orbitalFeaturesModifier;
                if (randValue <= 45)
                {
                    // No feature
                }
                else if (randValue <= 60)
                {
                    // Generate an Asteroid
                    if (_orbitalFeaturesNode == null)
                    {
                        _orbitalFeaturesNode = new OrbitalFeaturesNode(_systemCreationRules)
                        {
                            Parent = this
                        };
                        Children.Add(_orbitalFeaturesNode);
                    }
                    _orbitalFeaturesNode.AddAsteroid();
                }
                else if (randValue <= 90)
                {
                    // Generate a Lesser Moon
                    if (_orbitalFeaturesNode == null)
                    {
                        _orbitalFeaturesNode = new OrbitalFeaturesNode(_systemCreationRules)
                        {
                            Parent = this
                        };
                        Children.Add(_orbitalFeaturesNode);
                    }
                    _orbitalFeaturesNode.AddLesserMoon();
                }
                else
                {
                    // Generate a Moon
                    if (_orbitalFeaturesNode == null)
                    {
                        _orbitalFeaturesNode = new OrbitalFeaturesNode(_systemCreationRules)
                        {
                            Parent = this
                        };
                        Children.Add(_orbitalFeaturesNode);
                    }
                    _orbitalFeaturesNode.AddMoon(_bodyValue, false);
                }
            }
            GenerateNamesForOrbitalFeatures();

            // Generate Atmospheric Presence
            if (_systemCreationRules.HavenThickerAtmospheresInPrimaryBiosphere &&
                _effectiveSystemZone == SystemZone.PrimaryBiosphere)
            {
                atmosphericPresenceModifier    += 1;
                atmosphericCompositionModifier += 2;
            }

            randValue = Globals.RollD10() + atmosphericPresenceModifier;
            if (randValue <= 1 && !_forceInhabitable)
            {
                AtmosphereType       = AtmosphereTypes.None;
                _atmosphericPresence = "None";
                _hasAtmosphere       = false;
            }
            else if (randValue <= 4)
            {
                AtmosphereType       = AtmosphereTypes.Thin;
                _atmosphericPresence = "Thin";
                _hasAtmosphere       = true;
            }
            else if (randValue <= 9)
            {
                AtmosphereType       = AtmosphereTypes.Moderate;
                _atmosphericPresence = "Moderate";
                _hasAtmosphere       = true;
            }
            else
            {
                AtmosphereType       = AtmosphereTypes.Heavy;
                _atmosphericPresence = "Heavy";
                _hasAtmosphere       = true;
            }

            // Generate Atmospheric Composition
            if (_hasAtmosphere)
            {
                randValue = Globals.RollD10() + atmosphericCompositionModifier;
                if (randValue <= 1 && !_forceInhabitable)
                {
                    _atmosphericComposition = "Deadly";
                    _atmosphereTainted      = false;
                    _atmospherePure         = false;
                }
                else if (randValue <= 2 && !_forceInhabitable)
                {
                    _atmosphericComposition = "Corrosive";
                    _atmosphereTainted      = false;
                    _atmospherePure         = false;
                }
                else if (randValue <= 5 && !_forceInhabitable)
                {
                    _atmosphericComposition = "Toxic";
                    _atmosphereTainted      = false;
                    _atmospherePure         = false;
                }
                else if (randValue <= 7)
                {
                    _atmosphericComposition = "Tainted";
                    _atmosphereTainted      = true;
                    _atmospherePure         = false;
                }
                else
                {
                    _atmosphericComposition = "Pure";
                    _atmosphereTainted      = false;
                    _atmospherePure         = true;
                }
            }
            else
            {
                _atmosphericComposition = "None";
                _atmosphereTainted      = false;
                _atmospherePure         = false;
            }

            // Generate Climate
            if (_hasAtmosphere)
            {
                int climateModifier = 0;
                if (_effectiveSystemZone == SystemZone.InnerCauldron)
                {
                    climateModifier -= 6;
                }
                else if (_effectiveSystemZone == SystemZone.OuterReaches)
                {
                    climateModifier += 6;
                }

                randValue = Globals.RollD10() + climateModifier;
                if (randValue <= 0 && !_forceInhabitable)
                {
                    ClimateType           = ClimateTypes.BurningWorld;
                    _climate              = "Burning World";
                    habitabilityModifier -= 7;
                    maxHabitabilityRoll   = 3;
                }
                else if (randValue <= 3)
                {
                    ClimateType           = ClimateTypes.HotWorld;
                    _climate              = "Hot World";
                    habitabilityModifier -= 2;
                }
                else if (randValue <= 7)
                {
                    ClimateType = ClimateTypes.TemperateWorld;
                    _climate    = "Temperate World";
                }
                else if (randValue <= 10 || _forceInhabitable)
                {
                    ClimateType           = ClimateTypes.ColdWorld;
                    _climate              = "Cold World";
                    habitabilityModifier -= 2;
                }
                else
                {
                    ClimateType           = ClimateTypes.IceWorld;
                    _climate              = "Ice World";
                    habitabilityModifier -= 7;
                    maxHabitabilityRoll   = 3;
                }
            }
            else
            {
                if (_effectiveSystemZone == SystemZone.InnerCauldron)
                {
                    _climate              = "Burning World";
                    habitabilityModifier -= 7;
                }
                else if (_effectiveSystemZone == SystemZone.OuterReaches)
                {
                    _climate              = "Ice World";
                    habitabilityModifier -= 7;
                }
                else if (Globals.RollD10() <= 5)
                {
                    _climate              = "Burning World";
                    habitabilityModifier -= 7;
                }
                else
                {
                    _climate              = "Ice World";
                    habitabilityModifier -= 7;
                }
            }

            // Generate Habitability
            bool chanceOfAdaptedLife = false;

            if (Globals.RollD100() <= 2) // Provide a tiny chance that life develops on worlds that don't normally support it
            {
                chanceOfAdaptedLife = true;
                maxHabitabilityRoll = 9999;
            }

            if ((_hasAtmosphere &&
                 (_atmosphereTainted || _atmospherePure)) ||
                chanceOfAdaptedLife)
            {
                if (_systemCreationRules.HavenBetterHabitability)
                {
                    habitabilityModifier += 2;
                }

                randValue = Globals.RollD10() + habitabilityModifier;
                if (randValue > maxHabitabilityRoll)
                {
                    randValue = maxHabitabilityRoll;
                }

                if (randValue <= 1)
                {
                    _habitabiliy = Habitabiliy.Inhospitable;
                }
                else if (randValue <= 3)
                {
                    _habitabiliy = Habitabiliy.TrappedWater;
                }
                else if (randValue <= 5)
                {
                    _habitabiliy = Habitabiliy.LiquidWater;
                }
                else if (randValue <= 7)
                {
                    _habitabiliy = Habitabiliy.LimitedEcosystem;
                }
                else
                {
                    _habitabiliy = Habitabiliy.Verdant;
                }
            }
            else
            {
                _habitabiliy = Habitabiliy.Inhospitable;
            }

            if (_forceInhabitable)
            {
                if (_habitabiliy != Habitabiliy.LimitedEcosystem && _habitabiliy != Habitabiliy.Verdant)
                {
                    _habitabiliy = Globals.RollD5() <= 2 ? Habitabiliy.LimitedEcosystem : Habitabiliy.Verdant;
                }
            }

            // Generate Landmasses
            bool addLandmasses = false;

            if (_habitabiliy == Habitabiliy.LiquidWater ||
                _habitabiliy == Habitabiliy.LimitedEcosystem ||
                _habitabiliy == Habitabiliy.Verdant)
            {
                if (Globals.RollD10() >= 4)
                {
                    addLandmasses = true;
                }
            }
            else if (Globals.RollD10() >= 8)
            {
                addLandmasses = true;
            }

            if (addLandmasses)
            {
                _numContinents = Globals.RollD5();
                int temp1 = Globals.RollD100();
                int temp2 = Globals.RollD100();
                _numIslands = temp1 < temp2 ? temp1 : temp2;
                if (effectivePlanetSize == EffectivePlanetSize.Small)
                {
                    _numIslands -= 15;
                    if (_numIslands > 20)
                    {
                        _numIslands = 10 + Globals.RollD10();
                    }
                }
                if (effectivePlanetSize == EffectivePlanetSize.Large)
                {
                    _numIslands -= 10;
                    if (_numIslands > 50)
                    {
                        _numIslands = 40 + Globals.RollD10();
                    }
                }
                if (_habitabiliy == Habitabiliy.Inhospitable || _habitabiliy == Habitabiliy.TrappedWater)
                {
                    _numIslands -= 30;
                }
                if (_numIslands < 0)
                {
                    _numIslands = 0;
                }
            }

            // Generate Environments
            if (/*_numContinents > 0 &&*/
                (_habitabiliy == Habitabiliy.LimitedEcosystem ||
                 _habitabiliy == Habitabiliy.Verdant))
            {
                int numTerritories = Globals.RollD5();
                if (effectivePlanetSize == EffectivePlanetSize.Small)
                {
                    numTerritories -= 2;
                }
                if (effectivePlanetSize == EffectivePlanetSize.Vast)
                {
                    numTerritories += 3;
                }
                if (_habitabiliy == Habitabiliy.Verdant)
                {
                    numTerritories += 2;
                }
                if (numTerritories < 1)
                {
                    numTerritories = 1;
                }
                _environment = new Environment(numTerritories);
                _environment.Generate();
            }
            else
            {
                _environment = new Environment(0);
            }

            // Generate Base Mineral Resources
            int numMineralResources;

            switch (effectivePlanetSize)
            {
            case EffectivePlanetSize.Small:
                numMineralResources = Globals.RollD5() - 2;
                if (numMineralResources < 0)
                {
                    numMineralResources = 0;
                }
                break;

            case EffectivePlanetSize.Large:
                numMineralResources = Globals.RollD5();
                break;

            case EffectivePlanetSize.Vast:
                numMineralResources = Globals.RollD10();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            numMineralResources += _systemCreationRules.NumExtraMineralResourcesPerPlanet;
            GenerateMineralResources(numMineralResources, mineralResourceAbundanceModifier, maximumMineralResourceAbundance);

            if (_systemCreationRules.ChanceForExtraExoticMaterialsPerPlanet)
            {
                GenerateExoticMaterialsResource(1, mineralResourceAbundanceModifier, maximumMineralResourceAbundance);
            }

            // Generate Additional Resources
            int numOrganicCompoundsFromTerritories = _environment.GetNumOrganicCompounds();

            for (int i = 0; i < numOrganicCompoundsFromTerritories; i++)
            {
                GenerateOrganicCompound();
            }

            int numAdditionalResources;

            switch (effectivePlanetSize)
            {
            case EffectivePlanetSize.Small:
                numAdditionalResources = Globals.RollD5() - 3;
                if (numAdditionalResources < 0)
                {
                    numAdditionalResources = 0;
                }
                break;

            case EffectivePlanetSize.Large:
                numAdditionalResources = Globals.RollD5() - 2;
                if (numAdditionalResources < 0)
                {
                    numAdditionalResources = 0;
                }
                break;

            case EffectivePlanetSize.Vast:
                numAdditionalResources = Globals.RollD5() - 1;
                if (numAdditionalResources < 0)
                {
                    numAdditionalResources = 0;
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            for (int i = 0; i < numAdditionalResources; i++)
            {
                switch (Globals.RollD10())
                {
                case 1:
                case 2:
                    int bonusArcheotechAbundance = 0;
                    if (_systemCreationRules.RuinedEmpireIncreasedAbundanceArcheotechCaches)
                    {
                        bonusArcheotechAbundance += Globals.RollD10() + 5;
                    }
                    GenerateArcheotechCache(bonusArcheotechAbundance);
                    break;

                case 3:
                case 4:
                case 5:
                case 6:
                    GenerateMineralResources(1, mineralResourceAbundanceModifier, maximumMineralResourceAbundance);
                    break;

                case 7:
                case 8:
                    if (_habitabiliy == Habitabiliy.Verdant ||
                        _habitabiliy == Habitabiliy.LimitedEcosystem)
                    {
                        GenerateOrganicCompound();
                    }
                    else
                    {
                        i--;     // Re-roll this result
                    }
                    break;

                case 9:
                case 10:
                    int bonusXenotechAbundance = 0;
                    if (_systemCreationRules.RuinedEmpireIncreasedAbundanceXenosRuins)
                    {
                        bonusXenotechAbundance += Globals.RollD10() + 5;
                    }
                    GenerateXenosRuins(bonusXenotechAbundance);
                    break;
                }
            }

            // Generate Landmarks
            _environment.GenerateLandmarks(this, effectivePlanetSize);

            // Generate Inhabitants
            if ((_habitabiliy == Habitabiliy.Verdant ||
                 _habitabiliy == Habitabiliy.LimitedEcosystem))
            {
                if (Globals.RollD10() >= 8)
                {
                    GenerateInhabitants();
                }
            }
            else
            {
                if (Globals.RollD10() >= 10)
                {
                    GenerateInhabitants();
                }
            }
            if (_primitiveXenosNode.Children.Count < 1)
            {
                Children.Remove(_primitiveXenosNode);
            }

            // Generate Native Species
            int numNotableSpeciesFromTerritories = _environment.GetNumNotableSpecies();
            int numNativeSpecies = numNotableSpeciesFromTerritories;

            if (_habitabiliy == Habitabiliy.LimitedEcosystem)
            {
                numNativeSpecies += Globals.RollD5() + 1;
            }
            else if (_habitabiliy == Habitabiliy.Verdant)
            {
                numNativeSpecies += Globals.RollD5() + 5;
            }
            if (Properties.Settings.Default.UseKoronusBestiaryForXenosGeneration == false &&
                Properties.Settings.Default.UseStarsOfInequityForXenosGeneration == false)
            {
                numNativeSpecies = 0;
            }
            if (numNativeSpecies <= 0)
            {
                Children.Remove(_nativeSpeciesNode);
            }
            else
            {
                WorldType worldType = WorldType.TemperateWorld;
                if (ClimateType == ClimateTypes.IceWorld)
                {
                    worldType = WorldType.IceWorld;
                }
                if (ClimateType == ClimateTypes.BurningWorld)
                {
                    worldType = WorldType.VolcanicWorld;
                }
                if (ClimateType == ClimateTypes.HotWorld && Globals.RollD10() <= 6)
                {
                    worldType = WorldType.DesertWorld;
                }
                if (ClimateType == ClimateTypes.ColdWorld && Globals.RollD10() <= 6)
                {
                    worldType = WorldType.IceWorld;
                }
                WorldType = worldType;
                for (int i = 0; i < numNativeSpecies; i++)
                {
                    List <WorldType> notableSpeciesTerrainTypes = _environment.GetWorldTypesForNotableSpecies(this);
                    if (notableSpeciesTerrainTypes.Count >= i + 1)
                    {
                        worldType = notableSpeciesTerrainTypes[i];
                    }
                    _nativeSpeciesNode.AddXenos(worldType);
                }
            }
        }
Пример #4
0
        private static WeatherRangeData CreateWeatherData(HemisphereTypes hemisphere, SeasonTypes season, ClimateTypes climate,
                                                          int tempLo, int tempHi, int presLo, int presHi,
                                                          int cloudLo, int cloudHi, int humidLo, int humidHi,
                                                          int precipLo,
                                                          int precipHi, int energyLo, int energyHi, int windXLo,
                                                          int windXHi,
                                                          int windYLo, int windYHi)
        {
            var data = new WeatherRangeData(hemisphere, season, climate);

            data.SetData(tempLo, tempHi, presLo, presHi, cloudLo, cloudHi, humidLo, humidHi, precipLo, precipHi,
                         energyLo, energyHi, windXLo, windXHi, windYLo, windYHi);
            return(data);
        }