Exemplo n.º 1
0
        void RadomSun(StarData[] stars, int index, EStarType type, int seed)
        {
            var star = stars[index];
            //暂存原始星系数据
            var oldstar = star;

            if (seed == -1)
            {
                seed = random.Next();
            }
            if (data.ContainsKey(index))
            {
                data[index].seed = seed;
                //生成新的星系
                stars[index] = StarGen.CreateStar(GameMain.galaxy, oldstar.position, index + 1, seed, type, ESpectrType.O);
                //还给一些原始数据
                SwapStar(oldstar, stars[index]);
                SwapFinally();
            }
            else
            {
                data.Add(index, new SData(index, seed, type, ESpectrType.O));
            }
            if (oldstar == GameMain.localStar)
            {
                Traverse.Create(GameMain.data).Field("<localStar>k__BackingField").SetValue(stars[index]);
            }
        }
Exemplo n.º 2
0
 public SData(int index, int seed, EStarType type, ESpectrType eSpectr)
 {
     this.seed       = seed;
     this.type       = type;
     this.spectrType = eSpectr;
     this.index      = index;
 }
Exemplo n.º 3
0
 public void Import(BinaryReader r)
 {
     index      = r.ReadInt32();
     seed       = r.ReadInt32();
     type       = (EStarType)r.ReadInt32();
     spectrType = (ESpectrType)r.ReadInt32();
     other1     = r.ReadInt32();
     other2     = r.ReadInt32();
     other3     = r.ReadInt32();
 }
Exemplo n.º 4
0
        //随机一个获取并更换一个星系
        IEnumerator RadomSun(StarData[] stars, int index, EStarType type, ESpectrType type1 = ESpectrType.O)
        {
            yield return(new WaitForFixedUpdate());//等待帧结束

            var star = stars[index];
            //暂存原始星系数据
            var oldstar = star;
            int seed    = random.Next();

            if (data.ContainsKey(index))
            {
                data[index].seed       = seed;
                data[index].type       = type;
                data[index].spectrType = type1;
                //生成新的星系
                stars[index] = StarGen.CreateStar(GameMain.galaxy, oldstar.position, index + 1, seed, type, type1);
                //还给一些原始数据
                SwapStar(oldstar, stars[index]);

                if (selectData != null)
                {
                    selectData = stars[index];
                }
            }
            else
            {
                data.Add(index, new SData(index, seed, type, type1));
                //生成新的星系
                stars[index] = StarGen.CreateStar(GameMain.galaxy, oldstar.position, index + 1, seed, type, type1);
                //还给一些原始数据
                SwapStar(oldstar, stars[index]);
                selectData = stars[index];
            }
            if (oldstar == GameMain.localStar)
            {
                Traverse.Create(GameMain.data).Field("<localStar>k__BackingField").SetValue(stars[index]);
            }
            SwapFinally();
        }
Exemplo n.º 5
0
    //private int[] tmp_state;

    public GalaxyData CreateGalaxy(GameDesc gameDesc)
    {
        int     galaxySeed = gameDesc.galaxySeed;
        int     starCount  = gameDesc.starCount;
        StarGen StarGen    = new StarGen();

        Random     random    = new Random(galaxySeed);
        int        tempPoses = this.GenerateTempPoses(random.Next(), starCount, 4, 2.0, 2.3, 3.5, 0.18);
        GalaxyData galaxy    = new GalaxyData();

        galaxy.seed      = galaxySeed;
        galaxy.starCount = tempPoses;
        galaxy.stars     = new StarData[tempPoses];
        //Assert.Positive(tempPoses);
        if (tempPoses <= 0)
        {
            return(galaxy);
        }
        float num1  = (float)random.NextDouble();
        float num2  = (float)random.NextDouble();
        float num3  = (float)random.NextDouble();
        float num4  = (float)random.NextDouble();
        int   num5  = Mathf.CeilToInt((float)(0.00999999977648258 * (double)tempPoses + (double)num1 * 0.300000011920929));
        int   num6  = Mathf.CeilToInt((float)(0.00999999977648258 * (double)tempPoses + (double)num2 * 0.300000011920929));
        int   num7  = Mathf.CeilToInt((float)(0.0160000007599592 * (double)tempPoses + (double)num3 * 0.400000005960464));
        int   num8  = Mathf.CeilToInt((float)(0.0130000002682209 * (double)tempPoses + (double)num4 * 1.39999997615814));
        int   num9  = tempPoses - num5;
        int   num10 = num9 - num6;
        int   num11 = num10 - num7;
        int   num12 = (num11 - 1) / num8;
        int   num13 = num12 / 2;

        for (int index = 0; index < tempPoses; ++index)
        {
            int seed = random.Next();
            if (index == 0)
            {
                //生成母星系
                galaxy.stars[index] = StarGen.CreateBirthStar(galaxy, seed);
            }
            else
            {
                ESpectrType needSpectr = ESpectrType.X;
                if (index == 3)
                {
                    needSpectr = ESpectrType.M;
                }
                else if (index == num11 - 1)
                {
                    needSpectr = ESpectrType.O;
                }
                EStarType needtype = EStarType.MainSeqStar;
                if (index % num12 == num13)
                {
                    needtype = EStarType.GiantStar;
                }
                if (index >= num9)
                {
                    needtype = EStarType.BlackHole;
                }
                else if (index >= num10)
                {
                    needtype = EStarType.NeutronStar;
                }
                else if (index >= num11)
                {
                    needtype = EStarType.WhiteDwarf;
                }
                galaxy.stars[index] = StarGen.CreateStar(galaxy, this.tmp_poses[index], index + 1, seed, needtype, needSpectr);
            }
        }
        //AstroPose[] astroPoses = galaxy.astroPoses;


        StarData[] stars = galaxy.stars;
        //for (int index = 0; index < galaxy.astroPoses.Length; ++index)
        //{
        //    astroPoses[index].uRot.w = 1f;
        //    astroPoses[index].uRotNext.w = 1f;
        //}


        for (int index = 0; index < tempPoses; ++index)
        {
            StarGen.CreateStarPlanets(galaxy, stars[index], gameDesc);
            //astroPoses[stars[index].id * 100].uPos = astroPoses[stars[index].id * 100].uPosNext = stars[index].uPosition;
            //astroPoses[stars[index].id * 100].uRot = astroPoses[stars[index].id * 100].uRotNext = Quaternion.identity;
            //astroPoses[stars[index].id * 100].uRadius = stars[index].physicsRadius;
        }
        //galaxy.UpdatePoses(0.0);


        galaxy.birthPlanetId = 0;
        if (tempPoses > 0)
        {
            StarData starData = stars[0];
            for (int index = 0; index < starData.planetCount; ++index)
            {
                PlanetData    planet     = starData.planets[index];
                ThemeProtoSet themes     = ThemeWorks.GetThemes();
                var           themeProto = themes.dataArray[planet.theme - 1];
                if (themeProto != null && themeProto.Distribute == EThemeDistribute.Birth)
                {
                    galaxy.birthPlanetId = planet.id;
                    galaxy.birthStarId   = starData.id;
                    break;
                }
            }
        }
        //Assert.Positive(galaxy.birthPlanetId);
        for (int index1 = 0; index1 < tempPoses; ++index1)
        {
            StarData star = galaxy.stars[index1];
            for (int index2 = 0; index2 < star.planetCount; ++index2)
            {
                PlanetModelingManager.Algorithm(star.planets[index2]).GenerateVeins(true);
            }
        }
        //MUniverseGen.CreateGalaxyStarGraph(galaxy);
        return(galaxy);
    }
 public static void CreateStar(ref GalaxyData galaxy, ref VectorLF3 pos, ref int id, int seed, ref EStarType needtype, ref ESpectrType needSpectr, ref StarData __result)
 {
     //Console.WriteLine($"CreateStar() id: {__result.id}\r\n\tage: {__result.age}\r\n\tclassFactor: {__result.classFactor}\r\n\tcolor: {__result.color}\r\n\tluminosity: {__result.luminosity}\r\n\tradius: {__result.radius}\r\n\ttemperature: {__result.temperature}\r\n\tspectr: {__result.spectr}\r\n\tlifetime: {__result.lifetime}\r\n\tlightBalanceRaddius: {__result.lightBalanceRadius}\r\n\ttype: {__result.type}");
 }
Exemplo n.º 7
0
        // Move planets at runtime. This is the safest way (for your save files) to modify the planets, but also the buggiest.
        static void CreateGalaxy(ref GameDesc gameDesc, ref GalaxyData __result)
        {
            GalaxyDataHelper.RepairBirthIds(ref __result);

            // Seed rng from galaxy seed for deterministic randomness
            int seed = gameDesc.galaxySeed;

            seededRandom      = new Random(gameDesc.galaxySeed);
            arrangementString = null;

            GalaxyData        galaxy       = __result;
            List <PlanetData> gasPlanets   = new List <PlanetData>();
            List <PlanetData> otherPlanets = new List <PlanetData>();
            List <PlanetData> moons        = new List <PlanetData>();
            List <PlanetData> newMoons     = new List <PlanetData>();
            PlanetData        birthPlanet  = null;
            int  birthPlanetId             = __result.birthPlanetId;
            bool tooManyPlanets            = false;
            bool peacockSystem             = false;

            // Find starting system
            for (int i = 0; i < __result.stars.Length; i++)
            {
                StarData star = __result.stars[i];
                // If starting star
                if (star.index == 0)
                {
                    GSCompatPatch(ref star);

                    if (AlternativeStartPlugin.zDebuggingMode)
                    {
                        StarDataHelper.LogStarPlanetInfo(star);
                    }
                    // Edit the starting star
                    float       newLevel   = seededRandom.Next(15, 500) / 1000f;
                    EStarType   needtype   = EStarType.MainSeqStar;
                    ESpectrType needSpectr = ESpectrType.G;
                    if (gameDesc.galaxySeed == 16161616)
                    {
                        Debug.LogWarning($"Using anomaly seed {gameDesc.galaxySeed}");
                        newLevel   = 1f;
                        needtype   = EStarType.BlackHole;
                        needSpectr = ESpectrType.X;
                    }
                    else if (gameDesc.galaxySeed == 00000000)
                    {
                        Debug.LogWarning($"Using anomaly seed {gameDesc.galaxySeed}");
                        needSpectr = ESpectrType.O;
                    }
                    else if (newLevel < 0.03f)
                    {
                        needtype   = EStarType.GiantStar;
                        needSpectr = ESpectrType.M;
                    }
                    ModifyStar(ref star, newLevel, needtype, needSpectr);
                    arrangementString += $"{(int)star.type}{star.spectr.ToString()[0]}";
                    StartModification(ref star);
                    FinalizeModification(ref star);
                    // Log new system configuration
                    if (AlternativeStartPlugin.zDebuggingMode)
                    {
                        StarDataHelper.LogStarPlanetInfo(star);
                    }
                }
            }

            void GSCompatPatch(ref StarData star)
            {
                int oceans = 0;

                for (int i = 0; i < star.planets.Length; i++)
                {
                    PlanetData planet = star.planets[i];
                    if (planet.type == EPlanetType.Ocean)
                    {
                        oceans++;
                    }
                }
                if (oceans < 1)
                {
                    Debug.LogWarning($"Invalid starting system detected. Attempting to correct...");

                    // Look for a gas giant moon to turn into an ocean
                    for (int i = 0; i < star.planets.Length; i++)
                    {
                        PlanetData planet = star.planets[i];
                        if (planet.orbitAroundPlanet != null && planet.orbitAroundPlanet.type == EPlanetType.Gas)
                        {
                            Random seededRandom2 = new Random(seed);
                            PatchPlanetGen.ChangePlanetTheme(ref planet, 8, seededRandom2.NextDouble(), seededRandom2.NextDouble(), seededRandom2.NextDouble());
                            Debug.LogWarning($"Invalid starting system corrected.");
                            return;
                        }
                    }

                    // Turn any non-gas planet into an ocean
                    for (int i = star.planets.Length; i > 0; i--)
                    {
                        PlanetData planet = star.planets[i];
                        if (planet.type != EPlanetType.Gas)
                        {
                            Random seededRandom2 = new Random(seed);
                            PatchPlanetGen.ChangePlanetTheme(ref planet, 8, seededRandom2.NextDouble(), seededRandom2.NextDouble(), seededRandom2.NextDouble());
                            Debug.LogWarning($"Invalid starting system corrected.");
                            return;
                        }
                    }

                    Debug.LogError($"Failed to correct invalid starting system.");
                }
            }

            void ModifyStar(ref StarData star, float newLevel, EStarType needtype, ESpectrType needSpectr)
            {
                Debug.Log($"Started modifying birth star to level {newLevel}f");

                // Possibly allow starting systems to be a giant M-class?

                star.spectr = needSpectr;

                double num3 = seededRandom.NextDouble();
                double num4 = seededRandom.NextDouble();
                double numStarAgeRandomizer = seededRandom.NextDouble();
                double num6 = (seededRandom.NextDouble() - 0.5) * 0.2;
                double num7 = seededRandom.NextDouble() * 0.2 + 0.9;
                double num8 = seededRandom.NextDouble() * 0.4 - 0.2;
                double num9 = Math.Pow(2.0, num8);
                // modification to allow better class stars
                float num10 = Mathf.Lerp(-0.98f, 0.88f, newLevel);

                num10 = ((!(num10 < 0f)) ? (num10 + 0.65f) : (num10 - 0.65f));
                float standardDeviation = 0.33f;
                float num11             = StarGen.RandNormal(num10, standardDeviation, num3, num4);

                switch (needSpectr)
                {
                case ESpectrType.M:
                    num11 = -3f;
                    break;

                case ESpectrType.O:
                    num11 = 3f;
                    break;
                }

                num11 = ((!(num11 > 0f)) ? (num11 * 1f) : (num11 * 2f));
                num11 = Mathf.Clamp(num11, -2.4f, 4.65f) + (float)num6 + 1f;

                star.mass = Mathf.Pow(2f, num11);

                double d = 5.0;

                if (star.mass < 2f)
                {
                    d = 2.0 + 0.4 * (1.0 - (double)star.mass);
                }
                star.lifetime = (float)(10000.0 * Math.Pow(0.1, Math.Log10((double)star.mass * 0.5) / Math.Log10(d) + 1.0) * num7);


                switch (needtype)
                {
                case EStarType.BlackHole:
                    star.mass = 18f + (float)(num3 * num4) * 30f;
                    break;

                case EStarType.GiantStar:
                    star.lifetime = (float)(10000.0 * Math.Pow(0.1, Math.Log10((double)star.mass * 0.58) / Math.Log10(d) + 1.0) * num7);
                    star.age      = (float)numStarAgeRandomizer * 0.04f + 0.96f;
                    break;

                default:
                    if ((double)star.mass < 0.5)
                    {
                        star.age = (float)numStarAgeRandomizer * 0.12f + 0.02f;
                    }
                    else if ((double)star.mass < 0.8)
                    {
                        star.age = (float)numStarAgeRandomizer * 0.4f + 0.1f;
                    }
                    else
                    {
                        star.age = (float)numStarAgeRandomizer * 0.7f + 0.2f;
                    }
                    break;
                }

                if (needtype == EStarType.BlackHole)
                {
                    star.age = (float)numStarAgeRandomizer * 0.4f + 1f;
                }

                float num12 = star.lifetime * star.age;

                if (num12 > 5000f)
                {
                    num12 = (Mathf.Log(num12 / 5000f) + 1f) * 5000f;
                }
                if (num12 > 8000f)
                {
                    float f = num12 / 8000f;
                    f     = Mathf.Log(f) + 1f;
                    f     = Mathf.Log(f) + 1f;
                    f     = Mathf.Log(f) + 1f;
                    num12 = f * 8000f;
                }
                star.lifetime = num12 / star.age;
                float num13 = (1f - Mathf.Pow(Mathf.Clamp01(star.age), 20f) * 0.5f) * star.mass;

                star.temperature = (float)(Math.Pow(num13, 0.56 + 0.14 / (Math.Log10(num13 + 4f) / Math.Log10(5.0))) * 4450.0 + 1300.0);
                double num14 = Math.Log10(((double)star.temperature - 1300.0) / 4500.0) / Math.Log10(2.6) - 0.5;

                if (num14 < 0.0)
                {
                    num14 *= 4.0;
                }
                if (num14 > 2.0)
                {
                    num14 = 2.0;
                }
                else if (num14 < -4.0)
                {
                    num14 = -4.0;
                }
                star.spectr       = (ESpectrType)Mathf.RoundToInt((float)num14 + 4f);
                star.color        = Mathf.Clamp01(((float)num14 + 3.5f) * 0.2f);
                star.classFactor  = (float)num14;
                star.luminosity   = Mathf.Pow(num13, 0.7f);
                star.radius       = (float)(Math.Pow(star.mass, 0.4) * num9);
                star.acdiskRadius = 0f;
                float p = (float)num14 + 2f;

                star.habitableRadius    = Mathf.Pow(1.7f, p) + 0.25f * Mathf.Min(1f, star.orbitScaler);
                star.lightBalanceRadius = Mathf.Pow(1.7f, p);
                star.orbitScaler        = Mathf.Pow(1.35f, p);
                if (star.orbitScaler < 1f)
                {
                    star.orbitScaler = Mathf.Lerp(star.orbitScaler, 1f, 0.6f);
                }

                double rn = seededRandom.NextDouble();
                double rt = seededRandom.NextDouble();

                StarGen.SetStarAge(star, star.age, rn, rt);

                star.dysonRadius = star.orbitScaler * 0.28f;
                if ((double)star.dysonRadius * 40000.0 < (double)(star.physicsRadius * 1.5f))
                {
                    star.dysonRadius = (float)((double)(star.physicsRadius * 1.5f) / 40000.0);
                }
                star.uPosition = star.position * 2400000.0;

                Debug.Log($"Finished modifying birth star. Now a {star.spectr} class {star.type}...");
            }

            void StartModification(ref StarData star)
            {
                for (int j = 0; j < star.planets.Length; j++)
                {
                    PlanetData planet = star.planets[j];
                    // Sort planets into lists
                    if (birthPlanetId == planet.id)
                    {
                        birthPlanet = planet;
                        continue;
                    }
                    else if (planet.type == EPlanetType.Gas)
                    {
                        gasPlanets.Add(planet);
                        continue;
                    }
                    else if (planet.orbitAroundPlanet != null)
                    {
                        moons.Add(planet);
                        continue;
                    }
                    else
                    {
                        otherPlanets.Add(planet);
                    }
                }


                // Additional checks for modded games, and extremly rare starting system configurations.
                if (birthPlanet == null)
                {
                    Debug.LogError("alternatestart -- Failed to find birth planet");
                    return;
                }
                if (otherPlanets.Count() + moons.Count() > 2)
                {
                    tooManyPlanets = true;
                    Debug.LogWarning("alternatestart -- Modded starting system detected");
                }
                if (otherPlanets.Count() == 0 && moons.Count() == 0)
                {
                    Debug.LogWarning("alternatestart -- Not enough planets to change starting system");
                    return;
                }
                if (otherPlanets.Count() == 0 && moons.Count() > 0)
                {
                    peacockSystem = true;
                    Debug.LogWarning("alternatestart -- Peacock system detected");
                    if (tooManyPlanets)
                    {
                        Debug.LogWarning("alternatestart -- System is very strange");
                        if (gasPlanets.Count() == 0)
                        {
                            Debug.LogError("alternatestart -- Not possible to modify starting system. No other planets except birth planet.");
                            return;
                        }

                        return;
                    }
                }

                // Prior run detection;
                if (birthPlanet.orbitAroundPlanet == null)
                {
                    Debug.LogWarning("alternatestart -- System was already modified?");
                    return;
                }

                Debug.Log("alternatestart -- Started system modification");
                if (peacockSystem)
                {
                    MoveSystemPeacock();
                }
                else
                {
                    MoveSystemNormal();
                }
            }

            void FinalizeModification(ref StarData star)
            {
                for (int i = 0; i < gasPlanets.Count(); i++)
                {
                    PlanetData gasPlanet = gasPlanets[i];
                    RevokeSingularities(ref gasPlanet);
                }
                if (newMoons.Count > 1)
                {
                    // The starting planet having multiple moons and horizontal rotation is rare and might be cool.

                    //birthPlanet.singularity = EPlanetSingularity.MultipleSatellites;
                    //Debug.Log($"alternatestart -- Added plural satellites singularity to planet {birthPlanet.id}");
                }

                int skip = 1;
                int step = 1;

                switch (star.type)
                {
                case EStarType.GiantStar:
                    skip += 7;
                    break;

                default:
                    switch (star.spectr)
                    {
                    case ESpectrType.M:
                    case ESpectrType.K:
                        break;

                    case ESpectrType.G:
                    case ESpectrType.F:
                        skip = 2;
                        break;

                    case ESpectrType.A:
                        skip = 2;
                        step = 2;
                        break;

                    case ESpectrType.B:
                        skip = 3;
                        step = 2;
                        break;

                    case ESpectrType.O:
                        skip = 8;
                        break;

                    case ESpectrType.X:
                        skip = 4;
                        step = 2;
                        break;
                    }
                    break;
                }


                PlanetDataHelper.ReIndexPlanets(ref star, skip, step);
                PlanetDataHelper.ReOrbitPlanets(ref star, seededRandom);

                if (star.type == EStarType.BlackHole)
                {
                    star.planets.Select(x => x.luminosity *= 0.66f);
                }
            }

            void MoveSystemPeacock()
            {
                birthPlanet.orbitRadius       = 0.6f;
                birthPlanet.orbitInclination *= 1.2f;
                birthPlanet.orbitAroundPlanet = null;
                birthPlanet.orbitAround       = 0;
                birthPlanet.orbitIndex        = 1;

                for (int i = 0; i < moons.Count(); i++)
                {
                    PlanetData moon = moons[i];
                    PlanetDataHelper.StealMoon(ref birthPlanet, ref moon);
                    newMoons.Add(moon);
                    if (newMoons.Count() >= 2)
                    {
                        Debug.Log("alternatestart -- Birth planet has maximum allowed moons");
                        break;
                    }
                }

                Debug.LogWarning($"alternatestart -- New System arrangement is peacock");
            }

            void MoveSystemNormal()
            {
                double     num     = seededRandom.NextDouble();
                double     num2    = seededRandom.NextDouble();
                double     num3    = seededRandom.NextDouble();
                PlanetData lowest  = otherPlanets.OrderBy(x => x.orbitRadius).First();
                PlanetData highest = otherPlanets.OrderBy(x => x.orbitRadius).Last();

                // How should the system be arranged?
                if (num > 0.8f)
                {
                    arrangementString += 'C';
                    PlanetDataHelper.SwapPlanets(ref highest, ref birthPlanet);
                }
                else if (num > 0.6f)
                {
                    arrangementString += 'B';
                    PlanetDataHelper.SwapPlanets(ref lowest, ref birthPlanet);
                }
                else
                {
                    if (gasPlanets.Count() > 0)
                    {
                        arrangementString += 'A';
                        PlanetData gasPlanet = gasPlanets[0];
                        PlanetDataHelper.SwapPlanets(ref lowest, ref birthPlanet);
                        PlanetDataHelper.SwapPlanets(ref gasPlanet, ref birthPlanet);
                    }
                    else
                    {
                        PlanetDataHelper.SwapPlanets(ref lowest, ref birthPlanet);
                        arrangementString += 'D';
                    }
                }
                if (num2 > 0.30d)
                {
                    arrangementString += 'A';
                    PlanetDataHelper.StealMoon(ref birthPlanet, ref lowest);
                    newMoons.Add(lowest);
                    for (int i = 0; i < moons.Count(); i++)
                    {
                        PlanetData moon = moons[i];
                        if (moon.orbitAround != birthPlanet.id && !newMoons.Contains(moon))
                        {
                            PlanetDataHelper.StealMoon(ref birthPlanet, ref moon);
                            newMoons.Add(moon);
                            if (newMoons.Count() >= 2)
                            {
                                Debug.Log("alternatestart -- Birth planet has maximum allowed moons");
                                break;
                            }
                        }
                    }
                }
                else
                {
                    arrangementString += 'B';
                }

                // Orphan a gas giant moon?
                if (num3 > 0.6d)
                {
                    bool demooned = false;
                    for (int i = 0; i < birthPlanet.star.planets.Length; i++)
                    {
                        PlanetData moon = birthPlanet.star.planets[i];
                        if (moon.orbitAround != 0 && moon.orbitalPeriod != birthPlanet.id)
                        {
                            moon.orbitRadius       = moon.orbitAroundPlanet.orbitRadius * 1.2f;
                            moon.orbitAroundPlanet = null;
                            moon.orbitAround       = 0;
                            demooned           = true;
                            arrangementString += 'A';
                            break;
                        }
                    }
                    if (!demooned)
                    {
                        arrangementString += 'B';
                    }
                }
                else
                {
                    arrangementString += 'B';
                }

                Debug.LogWarning($"alternatestart -- New System arrangement is {arrangementString}");
            }

            // Remove any dangling multiple moon singularities from gas giants that no longer deserve them
            void RevokeSingularities(ref PlanetData targetPlanet)
            {
                int moonCount = 0;

                for (int i = 0; i < targetPlanet.star.planets.Count(); i++)
                {
                    PlanetData planet = targetPlanet.star.planets[i];
                    if (planet.orbitAround == targetPlanet.id)
                    {
                        if (moonCount++ > 1)
                        {
                            return;
                        }
                    }
                }
                if (targetPlanet.singularity == EPlanetSingularity.MultipleSatellites)
                {
                    Debug.Log($"alternatestart -- Removed plural satellites singularity from planet {targetPlanet.id}");
                    targetPlanet.singularity = EPlanetSingularity.None;
                }
            }
        }
        public static GalaxyData CreateGalaxy(GameDesc gameDesc)
        {
            int galaxyAlgo = gameDesc.galaxyAlgo;
            int galaxySeed = gameDesc.galaxySeed;
            int num        = gameDesc.starCount;

            if (galaxyAlgo < 20200101 || galaxyAlgo > 20591231)
            {
                throw new Exception("Wrong version of unigen algorithm!");
            }
            System.Random random = new System.Random(galaxySeed);
            int           seed   = random.Next();

            num = Traverse.Create(typeof(UniverseGen)).Method("GenerateTempPoses", seed, num, 4, 2.0, 2.3, 3.5, 0.18).GetValue <int>();
            GalaxyData galaxyData = new GalaxyData();

            galaxyData.seed      = galaxySeed;
            galaxyData.starCount = num;
            galaxyData.stars     = new StarData[num];
            Assert.Positive(num);
            if (num <= 0)
            {
                return(galaxyData);
            }
            float num2  = (float)random.NextDouble();
            float num3  = (float)random.NextDouble();
            float num4  = (float)random.NextDouble();
            float num5  = (float)random.NextDouble();
            int   num6  = Mathf.CeilToInt(0.01f * (float)num + num2 * 0.3f);
            int   num7  = Mathf.CeilToInt(0.01f * (float)num + num3 * 0.3f);
            int   num8  = Mathf.CeilToInt(0.016f * (float)num + num4 * 0.4f);
            int   num9  = Mathf.CeilToInt(0.013f * (float)num + num5 * 1.4f);
            int   num10 = num - num6;
            int   num11 = num10 - num7;
            int   num12 = num11 - num8;
            int   num13 = (num12 - 1) / num9;
            int   num14 = num13 / 2;

            for (int i = 0; i < num; i++)
            {
                int         seed2      = random.Next();
                ESpectrType needSpectr = ESpectrType.X;
                if (i == 3)
                {
                    needSpectr = ESpectrType.M;
                }
                else if (i == num12 - 1)
                {
                    needSpectr = ESpectrType.O;
                }
                EStarType needtype = EStarType.MainSeqStar;
                if (i % num13 == num14)
                {
                    needtype = EStarType.GiantStar;
                }
                if (i >= num10)
                {
                    needtype = EStarType.BlackHole;
                }
                else if (i >= num11)
                {
                    needtype = EStarType.NeutronStar;
                }
                else if (i >= num12)
                {
                    needtype = EStarType.WhiteDwarf;
                }
                galaxyData.stars[i] = StarGen.CreateStar(galaxyData, Traverse.Create(typeof(UniverseGen)).Field("tmp_poses").GetValue <List <VectorLF3> >()[i], i + 1, seed2, needtype, needSpectr);
            }
            AstroPose[] astroPoses = galaxyData.astroPoses;
            StarData[]  stars      = galaxyData.stars;
            for (int j = 0; j < galaxyData.astroPoses.Length; j++)
            {
                astroPoses[j].uRot.w     = 1f;
                astroPoses[j].uRotNext.w = 1f;
            }
            for (int k = 0; k < num; k++)
            {
                StarGen.CreateStarPlanets(galaxyData, stars[k], gameDesc);
                astroPoses[stars[k].id * 100].uPos    = (astroPoses[stars[k].id * 100].uPosNext = stars[k].uPosition);
                astroPoses[stars[k].id * 100].uRot    = (astroPoses[stars[k].id * 100].uRotNext = Quaternion.identity);
                astroPoses[stars[k].id * 100].uRadius = stars[k].physicsRadius;
            }
            galaxyData.UpdatePoses(0.0);
            galaxyData.birthPlanetId = 0;
            if (num > 0)
            {
                StarData starData = stars[0];
                for (int l = 0; l < starData.planetCount; l++)
                {
                    PlanetData planetData = starData.planets[l];
                    ThemeProto themeProto = LDB.themes.Select(planetData.theme);
                    if (themeProto != null && themeProto.Distribute == EThemeDistribute.Birth)
                    {
                        galaxyData.birthPlanetId = planetData.id;
                        galaxyData.birthStarId   = starData.id;
                        CustomBirthPlanet(planetData);
                        break;
                    }
                }
            }
            Assert.Positive(galaxyData.birthPlanetId);
            for (int m = 0; m < num; m++)
            {
                StarData starData2 = galaxyData.stars[m];
                for (int n = 0; n < starData2.planetCount; n++)
                {
                    PlanetData      planet          = starData2.planets[n];
                    PlanetAlgorithm planetAlgorithm = PlanetModelingManager.Algorithm(planet);
                    planetAlgorithm.GenerateVeins(true);
                }
            }
            UniverseGen.CreateGalaxyStarGraph(galaxyData);
            return(galaxyData);
        }
Exemplo n.º 9
0
    public StarData CreateStar(
        GalaxyData galaxy,
        VectorLF3 pos,
        int id,
        int seed,
        EStarType needtype,
        ESpectrType needSpectr = ESpectrType.X)
    {
        StarData starData = new StarData()
        {
            galaxy = galaxy,
            index  = id - 1
        };

        starData.level = galaxy.starCount <= 1 ? 0.0f : (float)starData.index / (float)(galaxy.starCount - 1);
        starData.id    = id;
        starData.seed  = seed;
        Random random1 = new Random(seed);
        int    seed1   = random1.Next();
        int    Seed    = random1.Next();

        starData.position = pos;
        float num1 = (float)pos.magnitude / 32f;

        if ((double)num1 > 1.0)
        {
            num1 = Mathf.Log(Mathf.Log(Mathf.Log(Mathf.Log(Mathf.Log(num1) + 1f) + 1f) + 1f) + 1f) + 1f;
        }
        starData.resourceCoef = Mathf.Pow(7f, num1) * 0.6f;
        Random random2           = new Random(Seed);
        double r1                = random2.NextDouble();
        double r2                = random2.NextDouble();
        double num2              = random2.NextDouble();
        double rn                = random2.NextDouble();
        double rt                = random2.NextDouble();
        double num3              = (random2.NextDouble() - 0.5) * 0.2;
        double num4              = random2.NextDouble() * 0.2 + 0.9;
        double y                 = random2.NextDouble() * 0.4 - 0.2;
        double num5              = Math.Pow(2.0, y);
        float  num6              = Mathf.Lerp(-0.98f, 0.88f, starData.level);
        float  averageValue      = (double)num6 >= 0.0 ? num6 + 0.65f : num6 - 0.65f;
        float  standardDeviation = 0.33f;

        if (needtype == EStarType.GiantStar)
        {
            averageValue      = y <= -0.08 ? 1.6f : -1.5f;
            standardDeviation = 0.3f;
        }
        float num7 = this.RandNormal(averageValue, standardDeviation, r1, r2);

        switch (needSpectr)
        {
        case ESpectrType.M:
            num7 = -3f;
            break;

        case ESpectrType.O:
            num7 = 3f;
            break;
        }
        float p1 = (float)((double)Mathf.Clamp((double)num7 <= 0.0 ? num7 * 1f : num7 * 2f, -2.4f, 4.65f) + num3 + 1.0);

        switch (needtype)
        {
        case EStarType.WhiteDwarf:
            starData.mass = (float)(1.0 + r2 * 5.0);
            break;

        case EStarType.NeutronStar:
            starData.mass = (float)(7.0 + r1 * 11.0);
            break;

        case EStarType.BlackHole:
            starData.mass = (float)(18.0 + r1 * r2 * 30.0);
            break;

        default:
            starData.mass = Mathf.Pow(2f, p1);
            break;
        }
        double d = 5.0;

        if ((double)starData.mass < 2.0)
        {
            d = 2.0 + 0.4 * (1.0 - (double)starData.mass);
        }
        starData.lifetime = (float)(10000.0 * Math.Pow(0.1, Math.Log10((double)starData.mass * 0.5) / Math.Log10(d) + 1.0) * num4);
        switch (needtype)
        {
        case EStarType.GiantStar:
            starData.lifetime = (float)(10000.0 * Math.Pow(0.1, Math.Log10((double)starData.mass * 0.58) / Math.Log10(d) + 1.0) * num4);
            starData.age      = (float)(num2 * 0.0399999991059303 + 0.959999978542328);
            break;

        case EStarType.WhiteDwarf:
        case EStarType.NeutronStar:
        case EStarType.BlackHole:
            starData.age = (float)(num2 * 0.400000005960464 + 1.0);
            if (needtype == EStarType.WhiteDwarf)
            {
                starData.lifetime += 10000f;
                break;
            }
            if (needtype == EStarType.NeutronStar)
            {
                starData.lifetime += 1000f;
                break;
            }
            break;

        default:
            starData.age = (double)starData.mass >= 0.5 ? ((double)starData.mass >= 0.8 ? (float)(num2 * 0.699999988079071 + 0.200000002980232) : (float)(num2 * 0.400000005960464 + 0.100000001490116)) : (float)(num2 * 0.119999997317791 + 0.0199999995529652);
            break;
        }
        float num8 = starData.lifetime * starData.age;

        if ((double)num8 > 5000.0)
        {
            num8 = (float)(((double)Mathf.Log(num8 / 5000f) + 1.0) * 5000.0);
        }
        if ((double)num8 > 8000.0)
        {
            num8 = (Mathf.Log(Mathf.Log(Mathf.Log(num8 / 8000f) + 1f) + 1f) + 1f) * 8000f;
        }
        starData.lifetime = num8 / starData.age;
        float f = (float)(1.0 - (double)Mathf.Pow(Mathf.Clamp01(starData.age), 20f) * 0.5) * starData.mass;

        starData.temperature = (float)(Math.Pow((double)f, 0.56 + 0.14 / (Math.Log10((double)f + 4.0) / Math.Log10(5.0))) * 4450.0 + 1300.0);
        double num9 = Math.Log10(((double)starData.temperature - 1300.0) / 4500.0) / Math.Log10(2.6) - 0.5;

        if (num9 < 0.0)
        {
            num9 *= 4.0;
        }
        if (num9 > 2.0)
        {
            num9 = 2.0;
        }
        else if (num9 < -4.0)
        {
            num9 = -4.0;
        }
        starData.spectr       = (ESpectrType)Mathf.RoundToInt((float)num9 + 4f);
        starData.color        = Mathf.Clamp01((float)((num9 + 3.5) * 0.200000002980232));
        starData.classFactor  = (float)num9;
        starData.luminosity   = Mathf.Pow(f, 0.7f);
        starData.radius       = (float)(Math.Pow((double)starData.mass, 0.4) * num5);
        starData.acdiskRadius = 0.0f;
        float p2 = (float)num9 + 2f;

        starData.habitableRadius    = Mathf.Pow(1.7f, p2) + 0.25f * Mathf.Min(1f, starData.orbitScaler);
        starData.lightBalanceRadius = Mathf.Pow(1.7f, p2);
        starData.orbitScaler        = Mathf.Pow(1.35f, p2);
        if ((double)starData.orbitScaler < 1.0)
        {
            starData.orbitScaler = Mathf.Lerp(starData.orbitScaler, 1f, 0.6f);
        }
        this.SetStarAge(starData, starData.age, rn, rt);
        starData.dysonRadius = starData.orbitScaler * 0.28f;
        if ((double)starData.dysonRadius * 40000.0 < (double)starData.physicsRadius * 1.5)
        {
            starData.dysonRadius = (float)((double)starData.physicsRadius * 1.5 / 40000.0);
        }
        starData.uPosition    = starData.position * 2400000.0;
        starData.name         = NameGen.RandomStarName(seed1, starData, galaxy);
        starData.overrideName = string.Empty;
        return(starData);
    }