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]); } }
//随机一个获取并更换一个星系 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(); }
//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 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); }