Exemple #1
0
        protected void GetTempChart(Planet mainWorld, Orbit orbit, double ComLumAddFromPrim, Star primary, bool forSatellite)
        {
            var L         = primary.Luminosity;
            var O         = Constants.HABITNUM / Math.Sqrt(orbit.Range);
            var atmosCode = 0;
            var E         = 0.0;

            if (Normal.Atmosphere.Value < 4)
            {
                atmosCode = 0;
            }
            else if (Normal.Atmosphere.Value < 10)
            {
                atmosCode = 1;
            }
            else if (Normal.Atmosphere.Value < 16)
            {
                atmosCode = 2;
            }
            else
            {
                atmosCode = 3;
            }

            if (orbit.OrbitalType == Orbit.OrbitType.HABITABLE)
            {
                E = DataTables.EnergyAbsorbHZ[Normal.Hydro.Value, atmosCode];
            }
            else
            {
                E = DataTables.EnergyAbsorbNHZ[Normal.Hydro.Value, atmosCode];
            }

            var G = DataTables.Greenhouse[Normal.Atmosphere.Value];

            if (_configuration.UseGaiaFactor && Maxpop > 5)
            {
                E = Common.CalcGaiaFactor(L, O, G, E);
            }

            var X = ((L * O) + ComLumAddFromPrim) * E * G;

            Temp = X - 273;

            var DayPlus    = Daytime(Rotation / 2, L, orbit.Range, forSatellite);
            var NightMinus = Nighttime(Rotation / 2, forSatellite);

            Tilt = AxialTilt();
            var k = 0;

            if (Tilt == 0.0)
            {
                k = 0;
            }
            else if (Tilt < 6.0)
            {
                k = 1;
            }
            else if (Tilt < 110)
            {
                k = 2;
            }
            else if (Tilt < 16.0)
            {
                k = 3;
            }
            else if (Tilt < 21.0)
            {
                k = 4;
            }
            else if (Tilt < 26.0)
            {
                k = 5;
            }
            else if (Tilt < 31.0)
            {
                k = 6;
            }
            else if (Tilt < 36.0)
            {
                k = 7;
            }
            else if (Tilt < 46.0)
            {
                k = 8;
            }
            else if (Tilt < 61.0)
            {
                k = 9;
            }
            else if (Tilt < 85.0)
            {
                k = 10;
            }
            else
            {
                k = 11;
            }

            Ecc = OrbitEcc();

            for (var i = 0; i < (Constants.NUM_HEX_ROWS * 2) - 1; i++)
            {
                if (i % 2 == 0)
                {
                    X = DayPlus;
                }
                else
                {
                    X = NightMinus;
                }

                if (!TidallyLocked || forSatellite)
                {
                    var eccentricty = 0.0;
                    if (forSatellite)
                    {
                        eccentricty = mainWorld.Ecc;
                    }
                    else
                    {
                        eccentricty = Ecc;
                    }
                    Summer[i] = Temp + DataTables.LatitudeMods[i / 2, Normal.Size.Value] + (eccentricty * 30) + ((0.6 * Tilt) * DataTables.AxialTiltEffects[i / 2, k]) + X;
                    Fall[i]   = Temp + DataTables.LatitudeMods[i / 2, Normal.Size.Value] + X;
                    Winter[i] = Temp + DataTables.LatitudeMods[i / 2, Normal.Size.Value] - (eccentricty * 30) - (Tilt * DataTables.AxialTiltEffects[i / 2, k]) + X;
                }
                else
                {
                    var latEffect = 0.0;
                    if (i % 2 == 0)
                    {
                        latEffect = Math.Min((X / Normal.Size.Value) * i / 2, X);
                    }
                    else
                    {
                        latEffect = Math.Max((X / Normal.Size.Value) * i / 2, X);
                    }
                    // Axial tilt has no effect on a tiddaly locked world
                    Summer[i] = Temp + DataTables.LatitudeMods[i / 2, Normal.Size.Value] + (Ecc * 30) + latEffect;
                    Fall[i]   = Temp + DataTables.LatitudeMods[i / 2, Normal.Size.Value] + latEffect;
                    Winter[i] = Temp + DataTables.LatitudeMods[i / 2, Normal.Size.Value] - (Ecc * 30) + latEffect;
                }
                if (_configuration.UseFarenheight)
                {
                    Summer[i] = Common.CtoF(Summer[i]);
                    Fall[i]   = Common.CtoF(Fall[i]);
                    Winter[i] = Common.CtoF(Winter[i]);
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// This version of DoCollapse is used when generating a complete system
        /// </summary>
        /// <param name="main"></param>
        public void DoCollapse(Planet main)
        {
            if (!MainWorld && PlanetType != WorldType.SGG && PlanetType != WorldType.LGG && PlanetType != WorldType.STAR)
            {
                var dieroll = 0;

                // Tech level decline (or for low tech worlds possibly increase!)
                if (Normal.TechLevel.Value <= 8)
                {
                    dieroll = Common.d6() - 3;
                }
                else if (Normal.TechLevel.Value >= 9 && Normal.TechLevel.Value <= 10)
                {
                    dieroll = Common.d6();
                }
                else if (Normal.TechLevel.Value >= 11 && Normal.TechLevel.Value <= 13)
                {
                    dieroll = Common.d6() + Common.d6();
                }
                else
                {
                    dieroll = Common.d6() + Common.d6() + Common.d6();
                }
                Collapse.TechLevel.Value = Normal.TechLevel.Value - dieroll;
                var techLevelFall = Normal.TechLevel.Value - Collapse.TechLevel.Value;

                if (Normal.Pop.Value > Maxpop)
                {
                    Collapse.Pop.Value = Maxpop;
                }
                else
                {
                    Collapse.Pop.Value = Normal.Pop.Value;
                }

                if (Collapse.Pop.Value == 0)
                {
                    // Everybody died!
                    Collapse.Starport         = 'Y';
                    Collapse.Government.Value = 0;
                    Collapse.Law.Value        = 0;
                    Collapse.TechLevel.Value  = 0;
                    Collapse.PopMult          = 0;
                }
                else
                {
                    Collapse.PopMult = Normal.PopMult - (techLevelFall / 4);
                    if (Collapse.PopMult < 0)
                    {
                        Collapse.Pop.Value -= 1;
                        Collapse.PopMult   += 9;
                    }
                    if (Collapse.Pop.Value <= 5)
                    {
                        Collapse.TechLevel.Value -= 1;
                        Collapse.PopMult         /= 2;
                        if (Collapse.PopMult < 1)
                        {
                            Collapse.Pop.Value -= 1;
                            Collapse.PopMult    = 5;
                        }
                    }

                    dieroll = Common.d6();
                    if (dieroll > techLevelFall)
                    {
                        Collapse.ReduceStarport(1);
                    }
                    else if (dieroll == techLevelFall)
                    {
                        Collapse.ReduceStarport(2);
                        Collapse.Bases = string.Empty;
                    }
                    else
                    {
                        Collapse.Starport = 'Y';
                        Collapse.Bases    = string.Empty;
                    }

                    var balk = Collapse.Size.Value + Collapse.Pop.Value - Collapse.TechLevel.Value;

                    dieroll = Common.d6() + Common.d6();
                    if (dieroll <= balk)
                    {
                        Collapse.Remarks += "Balk";
                    }

                    if (Collapse.Pop.Value > 4)
                    {
                        dieroll = Common.d10();
                        if (dieroll < techLevelFall)
                        {
                            Collapse.Government.Value = 6;
                        }
                        else
                        {
                            Collapse.Government.Value = Common.d6() + Common.d6() - 7 + Collapse.Pop.Value;
                        }
                    }
                    else
                    {
                        Collapse.Government.Value = Common.d6() + Common.d6() - 7 + Collapse.Pop.Value;
                    }
                    Collapse.Law.Value = Common.d6() + Common.d6() - 7 + Collapse.Government.Value;
                    if (Collapse.Government.Value == 6)
                    {
                        Collapse.Law.Value += 4;
                    }
                    // Population recovery
                    Collapse.PopMult *= 2;
                    if (Collapse.PopMult > 9)
                    {
                        Collapse.Pop.Value += 1;
                        Collapse.PopMult   -= 10;
                    }
                    Collapse.DoSubordinate(main.Collapse);
                }
            }
            foreach (var satellite in Satellites)
            {
                satellite.DoCollapse(main);
            }
        }