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]); } } }
/// <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); } }