private void GenerateObjects()
        {
            for (int i = 0; i < objectsMap.Height; ++i)
            {
                for (int j = 0; j < objectsMap.Width; j++)
                {
                    BiomModel biom = map[i, j].GetBiomModel();

                    if (objectsMap.IsTileEmpty(new Vector2Int(j, i)) &&
                        biom.Objects.Any() &&
                        random.Next(10000) / 100f < biom.ObjectsIntensity)
                    {
                        ObjectModel objectModel = rouletteWheelSelector.RouletteWheelSelection(biom.Objects);

                        AwaitingObject awaitingObject = new AwaitingObject()
                        {
                            AbstractObject = objectModel.AbstractObject,
                            Position       = new Vector2Float(j, i)
                        };

                        awaitingObjects.Add(awaitingObject);
                        objectsMap.MarkTiles(new Vector2Int(j, i), ObjectsMap.ObjectType.Object);
                    }
                }
            }
        }
        private void GenerateLocations()
        {
            LocationGenerator locationGenerator = new LocationGenerator(map, locationsMap, objectsMap, random);

            int minX = (int)(objectsMap.Width * 0.05), maxX = (int)(objectsMap.Width * 0.95);
            int minY = (int)(objectsMap.Height * 0.05), maxY = (int)(objectsMap.Height * 0.95);

            for (int i = minY; i < maxY; ++i)
            {
                for (int j = minX; j < maxX; ++j)
                {
                    BiomModel biom = map[i, j].GetBiomModel();

                    if (biom.Locations.Any() &&
                        locationsMap.CanGenerateIn(new Vector2Int(j, i)) &&
                        random.Next(10000) / 100f < biom.LocationsIntensity)
                    {
                        LocationModel locationDataModel = rouletteWheelSelector.RouletteWheelSelection(biom.Locations);

                        LocationInstance location = locationGenerator.GenerateLocation(locationDataModel, new Vector2Int(j, i));
                        if (location != null)
                        {
                            awaitingObjects.AddRange(location.BigObjects);
                            awaitingObjects.AddRange(location.Objects);
                            awaitingObjects.AddRange(location.Fence);

                            locationsMap.MarkLocation(location);
                        }
                    }
                }
            }
        }
Пример #3
0
        private void SmoothBiom(Vector2Int pos)
        {
            int countOfSameBiom          = 0;
            List <Vector2Int> neighbours = new List <Vector2Int>();
            Vector2Int        last;

            if (map.IsOnMap(last = new Vector2Int(pos.X - 1, pos.Y)))
            {
                if (map[pos.Y, pos.X].Biom == map[pos.Y, pos.X - 1].Biom)
                {
                    countOfSameBiom++;
                }

                neighbours.Add(last);
            }

            if (map.IsOnMap(last = new Vector2Int(pos.X, pos.Y - 1)))
            {
                if (map[pos.Y, pos.X].Biom == map[pos.Y - 1, pos.X].Biom)
                {
                    countOfSameBiom++;
                }

                neighbours.Add(last);
            }

            if (map.IsOnMap(last = new Vector2Int(pos.X + 1, pos.Y)))
            {
                if (map[pos.Y, pos.X].Biom == map[pos.Y, pos.X + 1].Biom)
                {
                    countOfSameBiom++;
                }

                neighbours.Add(last);
            }

            if (map.IsOnMap(last = new Vector2Int(pos.X, pos.Y + 1)))
            {
                if (map[pos.Y, pos.X].Biom == map[pos.Y + 1, pos.X].Biom)
                {
                    countOfSameBiom++;
                }

                neighbours.Add(last);
            }

            if (countOfSameBiom < 2)
            {
                BiomModel mostFrequentBiom = neighbours.GroupBy(x => map[x.Y, x.X].Biom)
                                             .Select(x => new { biom = x, cnt = x.Count() })
                                             .OrderByDescending(g => g.cnt)
                                             .Select(g => g.biom).First().Key;

                map[pos.Y, pos.X].Biom = mostFrequentBiom;
                neighbours.ForEach(x => positionToCheck.Push(x));
            }
        }
Пример #4
0
        private BiomModel GetWaterBiom(float value)
        {
            BiomModel biom = waterBiomes.Length > 0 ? waterBiomes?[0].Biom : null;

            for (int i = 1; i < waterBiomes.Length; ++i)
            {
                if (waterBiomes[i].WaterThresholding <= value)
                {
                    biom = waterBiomes[i].Biom;
                }
                else
                {
                    break;
                }
            }

            return(biom);
        }
        private BiomModel CalculateWaterBiom(float value)
        {
            BiomModel biom = null;

            for (int i = 0; i < waterBiomes.Length; ++i)
            {
                if (waterBiomes[i].WaterThresholding <= value)
                {
                    biom = waterBiomes[i].Biom;
                }
                else
                {
                    break;
                }
            }

            return(biom);
        }