public void GenerateCountries_WithMajorAndMinorCountryWithEmptyNames_CreatesCountry() { var provinces = new List <IProvince>(); var map = new Mock <IHexMap>(); var original = new GameObject(); var countryContainer = new GameObject(); var country = new Mock <ICountry>(); var instantiate = new Mock <Func <GameObject, GameObject> >(); instantiate.Setup(f => f.Invoke(original)).Returns(countryContainer); var colors = new List <Color> { Color.blue, Color.green }; var organisationFactory = new Mock <IOrganisationFactory>(); organisationFactory.Setup(o => o.CreateCountry(countryContainer, "Major 0", CountryType.Major, Color.blue)).Returns(country.Object); organisationFactory.Setup(o => o.CreateCountry(countryContainer, "Major 1", CountryType.Major, Color.green)).Returns(country.Object); organisationFactory.Setup(o => o.CreateCountry(countryContainer, "Minor 0", CountryType.Minor, Color.grey)).Returns(country.Object); organisationFactory.Setup(o => o.CreateCountry(countryContainer, "Minor 1", CountryType.Minor, Color.grey)).Returns(country.Object); organisationFactory.Setup(o => o.CreateCountry(countryContainer, "Minor 2", CountryType.Minor, Color.grey)).Returns(country.Object); organisationFactory.Setup(o => o.CreateCountry(countryContainer, "Minor 3", CountryType.Minor, Color.grey)).Returns(country.Object); var mapOrganizationGenerator = new Mock <IMapOrganizationGenerator>(); mapOrganizationGenerator.Setup(m => m.GenerateCountryOnMap(country.Object, It.IsAny <IList <IProvince> >(), map.Object, 0, 0.5f)); var countryGenerator = new CountryGenerator(organisationFactory.Object, mapOrganizationGenerator.Object); countryGenerator.GenerateCountries(provinces, map.Object, 2, 4, 4, 2, null, null, instantiate.Object, original, colors); instantiate.Verify(f => f.Invoke(original), Times.Exactly(6)); organisationFactory.Verify(o => o.CreateCountry(countryContainer, "Major 0", CountryType.Major, Color.blue), Times.Once); organisationFactory.Verify(o => o.CreateCountry(countryContainer, "Major 1", CountryType.Major, Color.green), Times.Once); organisationFactory.Verify(o => o.CreateCountry(countryContainer, "Minor 0", CountryType.Minor, Color.grey), Times.Once); organisationFactory.Verify(o => o.CreateCountry(countryContainer, "Minor 1", CountryType.Minor, Color.grey), Times.Once); organisationFactory.Verify(o => o.CreateCountry(countryContainer, "Minor 2", CountryType.Minor, Color.grey), Times.Once); organisationFactory.Verify(o => o.CreateCountry(countryContainer, "Minor 3", CountryType.Minor, Color.grey), Times.Once); }
private static Image DrawTerrain(CountryGenerator generator, List <RegionGenerator> regions, Action <DistrictGenerator, Graphics, GraphicsPath> drawDistrict, Action <RegionGenerator, Graphics> drawRegion) { var image = new Bitmap(generator.Width, generator.Height); Graphics g = Graphics.FromImage(image); Brush brush = new SolidBrush(Color.DarkBlue); g.FillRectangle(brush, 0, 0, generator.Width, generator.Height); foreach (var region in regions) { foreach (var district in region.Districts) { var path = new GraphicsPath(); path.AddLines(district.Vertices.Select(p => new System.Drawing.PointF(p.X, p.Y)).ToArray()); drawDistrict(district, g, path); } drawRegion?.Invoke(region, g); } return(image); }
// Start is called before the first frame update private void Start() { var points = new List <Point>(); try { Debug.Log(Application.dataPath); Debug.Log(Application.persistentDataPath); _mapObject = new GameObject("Map"); if (LoadMapFromCache()) { return; } _hexGrid = new HexGrid(Height, Width, HexTile); _map = new HexMap(Height, Width); _organisationFactory = new OrganisationFactory(); _mapOrganizationGenerator = new MapOrganizationGenerator(_mapObject, _organisationFactory); _countryGenerator = new CountryGenerator(_organisationFactory, _mapOrganizationGenerator); var heightMapGenerator = new HeightMapGenerator(MountainRatio); _terrainGenerator = new TerrainGenerator(heightMapGenerator); _terrainGenerator.DesertBelt = DesertBelt; _terrainGenerator.PoleBelt = PoleBelt; var voronoiMap = GenerateMap(); points = voronoiMap.Where(g => g is Site).Select(s => s.Point).ToList(); _provinceFactory = new ProvinceFactory(_map, _lines, Instantiate, Province, _organisationFactory); _regions = _provinceFactory.CreateProvinces(points); Debug.Log("Map check after region detection"); CheckMap(points); var majorCountryNames = SettingsLoader.Instance.MajorCountryNames; var minorCountryNames = SettingsLoader.Instance.MinorCountryNames; _countryNames = majorCountryNames.Union(minorCountryNames).ToList(); _countryGenerator.GenerateCountries(_regions, _map, MajorCountries, MinorCountries, ProvincesMajorCountries, ProvincesMinorCountries, majorCountryNames, minorCountryNames, Instantiate, Country, CountryColors); _mapOrganizationGenerator.GenerateContinentsList(Instantiate, Continent, _regions, _map, _mapObject); _terrainGenerator.GenerateTerrain(_map); var resources = SettingsLoader.Instance.ResourceSettings; ResourceService.Instance.SpreadResources(_map, resources); if (MapMode == MapMode.InGame) { SkinMap(); } else { ColorCountries(); } StoreMapIntoCache(); var siteCommands = string.Join(", ", points.Select(p => $"new Point({p.X}, {p.Y})")); var siteListComand = $"var points = new List<Point> {{ {siteCommands} }};"; Debug.Log(siteListComand); } catch (Exception e) { Debug.LogError(e); LogMap(); var siteCommands = string.Join(", ", points.Select(p => $"new Point({p.X}, {p.Y})")); var siteListComand = $"var points = new List<Point> {{ {siteCommands} }};"; Debug.Log(siteListComand); Debug.Log("var lines = new List<Position>()"); Debug.Log("{"); foreach (var line in _lines) { Debug.Log($"new Position({line.X}, {line.Y})"); } Debug.Log("}"); } }
private static void GenerateImage(int seed, int numInternalPoints, int numDistricts, int numRegions) { Console.WriteLine($"Generating with seed {seed}: {numInternalPoints} points, {numDistricts} districts in {numRegions} regions"); var generator = new CountryGenerator(seed); List <DistrictGenerator> districts = generator.GenerateTerrainDistricts(numInternalPoints, numDistricts); generator.ApplyDistrictProperties(districts); List <RegionGenerator> regions = generator.AllocateRegions(districts, numRegions); var captionFont = new Font("Segoe UI", 18); var captionBrush = new SolidBrush(Color.White); var captionFormat = new StringFormat { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Near }; var regionBrushes = new Dictionary <RegionGenerator, Brush>(); var hueStep = 240.0 / regions.Count; var hue = 0.0; foreach (var region in regions) { var color = new HSLColor(hue, 140, 120); regionBrushes.Add(region, new SolidBrush(color)); hue += hueStep; } var font = new Font("Segoe UI", 18); var textBrush = new SolidBrush(Color.Black); var textFormat = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; // draw region allocation var image = DrawTerrain(generator, regions, (district, g, path) => { var brush = regionBrushes[district.Region]; g.FillPath(brush, path); }, (region, g) => { var centerX = region.Districts.Sum(d => d.GetCenter().X) / region.Districts.Count; var centerY = region.Districts.Sum(d => d.GetCenter().Y) / region.Districts.Count; var totalPopulation = region.Districts.Sum(d => d.Population); g.DrawString(totalPopulation.ToString(), font, textBrush, centerX, centerY, textFormat); }); Graphics.FromImage(image).DrawString("Region (color) and region population (text)", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_regions.png", ImageFormat.Png); // draw population and population density var maxPopulationDensity = districts.Max(d => d.PopulationDensity); font = new Font("Segoe UI", 6); textBrush = new SolidBrush(Color.DarkRed); image = DrawTerrain(generator, regions, (district, g, path) => { int popVal = (int)(255 * district.PopulationDensity / maxPopulationDensity); if (popVal < 0) { popVal = 0; } var brush = new SolidBrush(Color.FromArgb(popVal, popVal, popVal)); g.FillPath(brush, path); var center = district.GetCenter(); g.DrawString(district.Population.ToString(), font, textBrush, center.X, center.Y, textFormat); }, null); Graphics.FromImage(image).DrawString("Population (text) and population density (color)", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_population.png", ImageFormat.Png); // draw urbanisation image = DrawTerrain(generator, regions, (district, g, path) => { int popVal = (int)(255 * district.Urbanisation); if (popVal < 0) { popVal = 0; } var brush = new SolidBrush(Color.FromArgb(popVal, popVal, popVal)); g.FillPath(brush, path); }, null); Graphics.FromImage(image).DrawString("Urbanisation", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_urbanisation.png", ImageFormat.Png); // draw coastalness image = DrawTerrain(generator, regions, (district, g, path) => { int popVal = (int)(255 * district.Coastalness); if (popVal < 0) { popVal = 0; } var brush = new SolidBrush(Color.FromArgb(popVal, popVal, popVal)); g.FillPath(brush, path); }, null); Graphics.FromImage(image).DrawString("Coastalness", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_coastalness.png", ImageFormat.Png); // draw wealth image = DrawTerrain(generator, regions, (district, g, path) => { int popVal = (int)(255 * district.Wealth); if (popVal < 0) { popVal = 0; } var brush = new SolidBrush(Color.FromArgb(popVal, popVal, popVal)); g.FillPath(brush, path); }, null); Graphics.FromImage(image).DrawString("Wealth", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_wealth.png", ImageFormat.Png); // draw age image = DrawTerrain(generator, regions, (district, g, path) => { int popVal = (int)(255 * district.Age); if (popVal < 0) { popVal = 0; } var brush = new SolidBrush(Color.FromArgb(popVal, popVal, popVal)); g.FillPath(brush, path); }, null); Graphics.FromImage(image).DrawString("Age", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_age.png", ImageFormat.Png); // draw education image = DrawTerrain(generator, regions, (district, g, path) => { int popVal = (int)(255 * district.Education); if (popVal < 0) { popVal = 0; } var brush = new SolidBrush(Color.FromArgb(popVal, popVal, popVal)); g.FillPath(brush, path); }, null); Graphics.FromImage(image).DrawString("Education", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_education.png", ImageFormat.Png); // draw health image = DrawTerrain(generator, regions, (district, g, path) => { int popVal = (int)(255 * district.Health); if (popVal < 0) { popVal = 0; } var brush = new SolidBrush(Color.FromArgb(popVal, popVal, popVal)); g.FillPath(brush, path); }, null); Graphics.FromImage(image).DrawString("Health", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_health.png", ImageFormat.Png); // draw geographic divide image = DrawTerrain(generator, regions, (district, g, path) => { int popVal = (int)(255 * district.GeographicDivide); if (popVal < 0) { popVal = 0; } var brush = new SolidBrush(Color.FromArgb(popVal, popVal, popVal)); g.FillPath(brush, path); }, null); Graphics.FromImage(image).DrawString("Geographic Divide", captionFont, captionBrush, 0, 0, captionFormat); image.Save($"{seed}_{numInternalPoints}_{numDistricts}_geographic_divide.png", ImageFormat.Png); }
public CountryController(CountryGenerator generator) { _countries.AddRange(generator.Countries); PlayerCountry = _countries.Find(c => c.Player); }
public void generateCountries(int eights, int fours) { CountryGenerator gen = new CountryGenerator(provinces, eights, fours); gen.generate(); }