public void WorldLoaderThread(int min, int max) { #if CREATE_CRASH_LOGS try #endif { for (int i = min; i < max; i++) { if (ExitThreads) { break; } Worlds[i].Lock.WaitOne(); if (!Worlds[i].IsLoaded) { Worlds[i].Lock.ReleaseMutex(); //Worlds[i].File = new OverworldFile(Worlds[i].FileName, true); Worlds[i].File = new OverworldFile(); Worlds[i].File.Data = new OverworldFile.OverworldData(); Worlds[i].Lock.WaitOne(); try { Worlds[i].File.Data.Screenshot = TextureManager.LoadInstanceTexture(Worlds[i].ScreenshotName); if (Worlds[i].File.Data.Screenshot != null) { Worlds[i].Button.Image = new ImageFrame(Worlds[i].File.Data.Screenshot); Worlds[i].Button.Mode = Button.ButtonMode.ImageButton; Worlds[i].Button.KeepAspectRatio = true; Worlds[i].Button.Text = Worlds[i].WorldName; Worlds[i].Button.TextColor = Color.Black; } else { Worlds[i].Button.Text = Worlds[i].WorldName; } } catch (Exception e) { Worlds[i].Button.Text = "ERROR " + Worlds[i].WorldName; Console.Error.WriteLine(e.Message); } Worlds[i].Lock.ReleaseMutex(); } else { Worlds[i].Lock.ReleaseMutex(); } Worlds[i].IsLoaded = true; } } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); } #endif }
public void GenerateWorld(int seed, int width, int height) { #if CREATE_CRASH_LOGS try #endif { Seed = seed; MathFunctions.Random = new ThreadSafeRandom(Seed); Overworld.heightNoise.Seed = seed; CurrentState = GenerationState.Generating; if (Overworld.Name == null) { Overworld.Name = WorldGenerationSettings.GetRandomWorldName(); } LoadingMessage = "Init.."; Overworld.heightNoise.Seed = Seed; worldData = new Color[width * height]; Overworld.Map = new Overworld.MapData[width, height]; Progress = 0.01f; LoadingMessage = "Height Map ..."; float[,] heightMapLookup = null; heightMapLookup = Overworld.GenerateHeightMapLookup(width, height); Overworld.GenerateHeightMapFromLookup(heightMapLookup, width, height, 1.0f, false); Progress = 0.05f; int numRains = (int)Settings.NumRains; int rainLength = 250; int numRainSamples = 3; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Overworld.Map[x, y].Erosion = 1.0f; Overworld.Map[x, y].Weathering = 0; Overworld.Map[x, y].Faults = 1.0f; } } LoadingMessage = "Climate"; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Overworld.Map[x, y].Temperature = ((float)(y) / (float)(height)) * Settings.TemperatureScale; //Overworld.Map[x, y].Rainfall = Math.Max(Math.Min(Overworld.noise(x, y, 1000.0f, 0.01f) + Overworld.noise(x, y, 100.0f, 0.1f) * 0.05f, 1.0f), 0.0f) * RainfallScale; } } //Overworld.Distort(width, height, 60.0f, 0.005f, Overworld.ScalarFieldType.Rainfall); Overworld.Distort(width, height, 30.0f, 0.005f, Overworld.ScalarFieldType.Temperature); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Overworld.Map[x, y].Temperature = Math.Max(Math.Min(Overworld.Map[x, y].Temperature, 1.0f), 0.0f); } } int numVoronoiPoints = (int)Settings.NumFaults; if (UpdatePreview != null) { UpdatePreview(); } Progress = 0.1f; LoadingMessage = "Faults ..."; #region voronoi Voronoi(width, height, numVoronoiPoints); #endregion Overworld.GenerateHeightMapFromLookup(heightMapLookup, width, height, 1.0f, true); Progress = 0.2f; Overworld.GenerateHeightMapFromLookup(heightMapLookup, width, height, 1.0f, true); Progress = 0.25f; if (UpdatePreview != null) { UpdatePreview(); } LoadingMessage = "Erosion..."; #region erosion float[,] buffer = new float[width, height]; Erode(width, height, Settings.SeaLevel, Overworld.Map, numRains, rainLength, numRainSamples, buffer); Overworld.GenerateHeightMapFromLookup(heightMapLookup, width, height, 1.0f, true); #endregion Progress = 0.9f; LoadingMessage = "Blur."; Overworld.Blur(Overworld.Map, width, height, Overworld.ScalarFieldType.Erosion); LoadingMessage = "Generate height."; Overworld.GenerateHeightMapFromLookup(heightMapLookup, width, height, 1.0f, true); LoadingMessage = "Rain"; CalculateRain(width, height); LoadingMessage = "Biome"; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Overworld.Map[x, y].Biome = Overworld.GetBiome(Overworld.Map[x, y].Temperature, Overworld.Map[x, y].Rainfall, Overworld.Map[x, y].Height).Biome; } } LoadingMessage = "Volcanoes"; GenerateVolcanoes(width, height); if (UpdatePreview != null) { UpdatePreview(); } LoadingMessage = "Factions"; FactionLibrary library = new FactionLibrary(); library.Initialize(null, new CompanyInformation()); if (Settings.Natives == null || Settings.Natives.Count == 0) { NativeCivilizations = new List <Faction>(); for (int i = 0; i < Settings.NumCivilizations; i++) { NativeCivilizations.Add(library.GenerateFaction(null, i, Settings.NumCivilizations)); } Settings.Natives = NativeCivilizations; } else { NativeCivilizations = Settings.Natives; if (Settings.NumCivilizations > Settings.Natives.Count) { int count = Settings.Natives.Count; for (int i = count; i < Settings.NumCivilizations; i++) { NativeCivilizations.Add(library.GenerateFaction(null, i, Settings.NumCivilizations)); } } } SeedCivs(Overworld.Map, Settings.NumCivilizations, NativeCivilizations); GrowCivs(Overworld.Map, 200, NativeCivilizations); for (int x = 0; x < width; x++) { Overworld.Map[x, 0] = Overworld.Map[x, 1]; Overworld.Map[x, height - 1] = Overworld.Map[x, height - 2]; } for (int y = 0; y < height; y++) { Overworld.Map[0, y] = Overworld.Map[1, y]; Overworld.Map[width - 1, y] = Overworld.Map[width - 2, y]; } LoadingMessage = "Selecting Spawn Point"; AutoSelectSpawnRegion(); CurrentState = GenerationState.Finished; LoadingMessage = ""; Progress = 1.0f; } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); throw; } #endif }
public void GenerateWorld() { #if !DEBUG try #endif { CurrentState = GenerationState.Generating; LoadingMessage = "Init.."; OverworldMap.heightNoise.Seed = Overworld.Seed; Overworld.Map.Map = new OverworldCell[Overworld.Width, Overworld.Height]; Progress = 0.01f; LoadingMessage = "Height Map ..."; float[,] heightMapLookup = null; heightMapLookup = OverworldMap.GenerateHeightMapLookup(Overworld.Width, Overworld.Height); Overworld.Map.CreateHeightFromLookup(heightMapLookup); Progress = 0.05f; int numRains = (int)Overworld.GenerationSettings.NumRains; int rainLength = 250; int numRainSamples = 3; for (int x = 0; x < Overworld.Width; x++) { for (int y = 0; y < Overworld.Height; y++) { Overworld.Map.Map[x, y].Erosion = 1.0f; Overworld.Map.Map[x, y].Weathering = 0; Overworld.Map.Map[x, y].Faults = 1.0f; } } LoadingMessage = "Climate"; for (int x = 0; x < Overworld.Width; x++) { for (int y = 0; y < Overworld.Height; y++) { Overworld.Map.Map[x, y].Temperature = ((float)(y) / (float)(Overworld.Height)) * Overworld.GenerationSettings.TemperatureScale; } } OverworldImageOperations.Distort(Overworld.Map.Map, Overworld.Width, Overworld.Height, 30.0f, 0.005f, OverworldField.Temperature); for (int x = 0; x < Overworld.Width; x++) { for (int y = 0; y < Overworld.Height; y++) { Overworld.Map.Map[x, y].Temperature = Math.Max(Math.Min(Overworld.Map.Map[x, y].Temperature, 1.0f), 0.0f); } } int numVoronoiPoints = (int)Overworld.GenerationSettings.NumFaults; Progress = 0.1f; LoadingMessage = "Faults ..."; Voronoi(Overworld.Width, Overworld.Height, numVoronoiPoints); Overworld.Map.CreateHeightFromLookupWithErosion(heightMapLookup); Progress = 0.2f; Overworld.Map.CreateHeightFromLookupWithErosion(heightMapLookup); Progress = 0.25f; LoadingMessage = "Erosion..."; var buffer = new float[Overworld.Width, Overworld.Height]; Erode(Overworld.Width, Overworld.Height, Overworld.GenerationSettings.SeaLevel, Overworld.Map.Map, numRains, rainLength, numRainSamples, buffer); Overworld.Map.CreateHeightFromLookupWithErosion(heightMapLookup); Progress = 0.9f; LoadingMessage = "Blur."; OverworldImageOperations.Blur(Overworld.Map.Map, Overworld.Width, Overworld.Height, OverworldField.Erosion); LoadingMessage = "Generate height."; Overworld.Map.CreateHeightFromLookupWithErosion(heightMapLookup); LoadingMessage = "Rain"; CalculateRain(Overworld.Width, Overworld.Height); LoadingMessage = "Biome"; for (int x = 0; x < Overworld.Width; x++) { for (int y = 0; y < Overworld.Height; y++) { Overworld.Map.Map[x, y].Biome = Library.GetBiomeForConditions(Overworld.Map.Map[x, y].Temperature, Overworld.Map.Map[x, y].Rainfall, Overworld.Map.Map[x, y].Height).Biome; } } LoadingMessage = "Volcanoes"; GenerateVolcanoes(Overworld.Width, Overworld.Height); LoadingMessage = "Factions"; FactionSet library = new FactionSet(); library.Initialize(null, new CompanyInformation()); Overworld.Natives = new List <OverworldFaction>(); foreach (var fact in library.Factions) { Overworld.Natives.Add(fact.Value.ParentFaction); // Todo: Don't create a whole faction just to grab the overworldfactions from them. } for (int i = 0; i < Overworld.GenerationSettings.NumCivilizations; i++) { Overworld.Natives.Add(library.GenerateOverworldFaction(Overworld, i, Overworld.GenerationSettings.NumCivilizations)); } Politics.Initialize(Overworld); Overworld.ColonyCells = new CellSet("World\\colonies"); Overworld.InstanceSettings = new InstanceSettings(Overworld.ColonyCells.GetCellAt(16, 0)); SeedCivs(); GrowCivs(); for (int x = 0; x < Overworld.Width; x++) { Overworld.Map.Map[x, 0] = Overworld.Map.Map[x, 1]; Overworld.Map.Map[x, Overworld.Height - 1] = Overworld.Map.Map[x, Overworld.Height - 2]; } for (int y = 0; y < Overworld.Height; y++) { Overworld.Map.Map[0, y] = Overworld.Map.Map[1, y]; Overworld.Map.Map[Overworld.Width - 1, y] = Overworld.Map.Map[Overworld.Width - 2, y]; } CurrentState = GenerationState.Finished; LoadingMessage = ""; Progress = 1.0f; } #if !DEBUG catch (Exception exception) { ProgramData.WriteExceptionLog(exception); throw; } #endif }
public void GenerateWorld(int seed, int width, int height) { #if CREATE_CRASH_LOGS try #endif { GUI.MouseMode = GUISkin.MousePointer.Wait; PlayState.Random = new ThreadSafeRandom(Seed); GenerationComplete = false; LoadingMessage = "Init.."; Overworld.heightNoise.Seed = Seed; worldMap = new Texture2D(Game.GraphicsDevice, width, height); worldData = new Color[width * height]; Overworld.Map = new Overworld.MapData[width, height]; Progress.Value = 0.01f; LoadingMessage = "Height Map ..."; Overworld.GenerateHeightMap(width, height, 1.0f, false); Progress.Value = 0.05f; int numRains = (int)Settings.NumRains; int rainLength = 250; int numRainSamples = 3; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Overworld.Map[x, y].Erosion = 1.0f; Overworld.Map[x, y].Weathering = 0; Overworld.Map[x, y].Faults = 1.0f; } } LoadingMessage = "Climate"; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Overworld.Map[x, y].Temperature = ((float)(y) / (float)(height)) * Settings.TemperatureScale; //Overworld.Map[x, y].Rainfall = Math.Max(Math.Min(Overworld.noise(x, y, 1000.0f, 0.01f) + Overworld.noise(x, y, 100.0f, 0.1f) * 0.05f, 1.0f), 0.0f) * RainfallScale; } } //Overworld.Distort(width, height, 60.0f, 0.005f, Overworld.ScalarFieldType.Rainfall); Overworld.Distort(width, height, 30.0f, 0.005f, Overworld.ScalarFieldType.Temperature); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Overworld.Map[x, y].Temperature = Math.Max(Math.Min(Overworld.Map[x, y].Temperature, 1.0f), 0.0f); } } Overworld.TextureFromHeightMap("Height", Overworld.Map, Overworld.ScalarFieldType.Height, width, height, MapPanel.Lock, worldData, worldMap, Settings.SeaLevel); int numVoronoiPoints = (int)Settings.NumFaults; Progress.Value = 0.1f; LoadingMessage = "Faults ..."; #region voronoi Voronoi(width, height, numVoronoiPoints); #endregion Overworld.GenerateHeightMap(width, height, 1.0f, true); Progress.Value = 0.2f; Overworld.GenerateHeightMap(width, height, 1.0f, true); Progress.Value = 0.25f; Overworld.TextureFromHeightMap("Height", Overworld.Map, Overworld.ScalarFieldType.Height, width, height, MapPanel.Lock, worldData, worldMap, Settings.SeaLevel); LoadingMessage = "Erosion..."; #region erosion float[,] buffer = new float[width, height]; Erode(width, height, Settings.SeaLevel, Overworld.Map, numRains, rainLength, numRainSamples, buffer); Overworld.GenerateHeightMap(width, height, 1.0f, true); #endregion Progress.Value = 0.9f; LoadingMessage = "Blur."; Overworld.Blur(Overworld.Map, width, height, Overworld.ScalarFieldType.Erosion); LoadingMessage = "Generate height."; Overworld.GenerateHeightMap(width, height, 1.0f, true); LoadingMessage = "Rain"; CalculateRain(width, height); LoadingMessage = "Biome"; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { Overworld.Map[x, y].Biome = Overworld.GetBiome(Overworld.Map[x, y].Temperature, Overworld.Map[x, y].Rainfall, Overworld.Map[x, y].Height); } } LoadingMessage = "Volcanoes"; GenerateVolcanoes(width, height); Overworld.TextureFromHeightMap("Height", Overworld.Map, Overworld.ScalarFieldType.Height, width, height, MapPanel.Lock, worldData, worldMap, Settings.SeaLevel); LoadingMessage = "Factions"; NativeCivilizations = new List <Faction>(); FactionLibrary library = new FactionLibrary(); library.Initialize(null, "fake", "fake", null, Color.Blue); for (int i = 0; i < Settings.NumCivilizations; i++) { NativeCivilizations.Add(library.GenerateFaction(i, Settings.NumCivilizations)); } SeedCivs(Overworld.Map, Settings.NumCivilizations, NativeCivilizations); GrowCivs(Overworld.Map, 200, NativeCivilizations); for (int x = 0; x < width; x++) { Overworld.Map[x, 0] = Overworld.Map[x, 1]; Overworld.Map[x, height - 1] = Overworld.Map[x, height - 2]; } for (int y = 0; y < height; y++) { Overworld.Map[0, y] = Overworld.Map[1, y]; Overworld.Map[width - 1, y] = Overworld.Map[width - 2, y]; } GenerationComplete = true; MapPanel.Image = new ImageFrame(worldMap, new Rectangle(0, 0, worldMap.Width, worldMap.Height)); MapPanel.LocalBounds = new Rectangle(300, 30, worldMap.Width, worldMap.Height); Progress.Value = 1.0f; IsGenerating = false; GUI.MouseMode = GUISkin.MousePointer.Pointer; DoneGenerating = true; } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); throw; } #endif }