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);
        }
Beispiel #2
0
        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("}");
        }
    }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 public CountryController(CountryGenerator generator)
 {
     _countries.AddRange(generator.Countries);
     PlayerCountry = _countries.Find(c => c.Player);
 }
Beispiel #6
0
    public void generateCountries(int eights, int fours)
    {
        CountryGenerator gen = new CountryGenerator(provinces, eights, fours);

        gen.generate();
    }