예제 #1
0
        /// <summary>
        /// Changes to level to a given map
        /// </summary>
        /// <param name="map">New streamed tile map</param>
        /// <param name="disposeCurrentMap">Disposes the current level when true</param>
        public void Changelevel(StreamedTileMap map, bool disposeCurrentMap)
        {
            if (!disposeCurrentMap && currentLevel != null)
            {
                maps.Add(currentLevel);
            }
            currentLevel = map;

            GridChanged?.Invoke(this, new GridEventArgs(currentLevel.GridRow, currentLevel.GridColumn, -1, -1, false));
        }
예제 #2
0
        /// <summary>
        /// Changes to level to map that will be generated based on the current position
        /// </summary>
        /// <param name="tileColumn">Tile column index</param>
        /// <param name="tileRow">Tile row index</param>
        /// <param name="disposeCurrentMap">Disposes the current level when true</param>
        public void Changelevel(int tileColumn, int tileRow, bool disposeCurrentMap)
        {
            if (!disposeCurrentMap && currentLevel != null)
            {
                maps.Add(CurrentLevel);
            }

            UnSub();
            currentLevel = generator.GenerateMap(tileColumn, tileRow);
            Sub();

            GridChanged?.Invoke(this, new GridEventArgs(currentLevel.GridRow, currentLevel.GridColumn, -1, -1, false));
        }
예제 #3
0
        /// <summary>
        /// Changes to level to map that will be generated based on the current position
        /// </summary>
        /// <param name="settings">Setting to generate the new map</param>
        /// <param name="tileColumn">Tile column index</param>
        /// <param name="tileRow">Tile row index</param>
        /// <param name="disposeCurrentMap">Disposes the current level when true</param>
        public void Changelevel(GeneratorSettings settings, int tileColumn, int tileRow, bool disposeCurrentMap)
        {
            this.settings = settings;
            if (!disposeCurrentMap && currentLevel != null)
            {
                maps.Add(CurrentLevel);
            }
            generator = new TileMapGenerator();
            UnSub();
            currentLevel = generator.GenerateMap(settings, spreads, tileColumn, tileRow);
            Sub();

            GridChanged?.Invoke(this, new GridEventArgs(currentLevel.GridRow, currentLevel.GridColumn, -1, -1, false));
        }
예제 #4
0
        /// <summary>
        /// Starts new map generation
        /// </summary>
        /// <param name="currentTileRow">Tile row index</param>
        /// <param name="currentTileColumn">tile column index</param>
        private void Resize(int currentTileRow, int currentTileColumn)
        {
            if (generator != null)
            {
                if (newMap != null)
                {
                    newMapAvalible = true;
                    if (TryMapUpdate(gridRow, gridColumn))
                    {
                        return;
                    }
                }

                newMapAvalible  = false;
                newMapRequested = true;
                new Thread(() =>
                {
                    newMap         = generator.GenerateMap(currentTileColumn, currentTileRow);
                    newMapAvalible = true;
                }).Start();
            }
        }
예제 #5
0
        /// <summary>
        /// Create the StreamedTileMap from the generated grids
        /// </summary>
        /// <param name="maps">Current grid with all it's surrounding grids</param>
        /// <param name="suroundingGrids">Ids of all surrounding grids</param>
        /// <param name="gridsPerRow">Number grids per row</param>
        /// <param name="streamedTileMap">A reference to a streamedTileMap</param>
        private void CreateTileMapParts(Tile[][] maps, List <ObjectTile>[] objectTiles, int[] suroundingGrids, int gridsPerRow, StreamedTileMap streamedTileMap)
        {
            //create TileMapPart
            for (int i = 0; i < maps.Length; i++)
            {
                int gridId = suroundingGrids[i];

                int gridRow;
                int gridColumn;
                TileMathHelper.ToPosition(gridId, gridsPerRow, out gridRow, out gridColumn);

                gridRow    = TileMathHelper.FixTileIndex(gridRow, gridsPerRow);
                gridColumn = TileMathHelper.FixTileIndex(gridColumn, gridsPerRow);

                TileMapPart part = new TileMapPart(gridId, maps[i], null, objectTiles[i].ToArray(), gridColumn, gridRow);
                streamedTileMap.Add(part);
            }
        }
예제 #6
0
        /// <summary>
        /// Generates a map based on the given tile location, generator settings and area spreads
        /// </summary>
        /// <param name="settings">Generator settings to modify the generation process</param>
        /// <param name="areas">Areas that should be placed on the map</param>
        /// <param name="tileColumn">Tile column index</param>
        /// <param name="tileRow">Tile row index</param>
        /// <returns>Returns a StreamedTileMap</returns>
        public StreamedTileMap GenerateMap(GeneratorSettings settings, AreaSpread[] areas, int tileColumn, int tileRow)
        {
            if (settings.Seed > 0)
            {
                random = new Random(settings.Seed);
            }
            else if (random == null)
            {
                throw new ArgumentOutOfRangeException();
            }

            this.settings = settings;
            spreads       = areas;

            double tilesPerGrid   = Math.Round(settings.MeterPerGrid / settings.MeterPerTile);
            int    tilesPerColumn = (int)tilesPerGrid;
            int    size           = tilesPerColumn * tilesPerColumn;
            int    gridsPerRow    = (int)Math.Ceiling(GetMapSize(settings) / tilesPerGrid);

            int gridColumn = (int)Math.Floor(tileColumn / tilesPerGrid);
            int gridRow    = (int)Math.Floor(tileRow / tilesPerGrid);

            Tile[][]            edgeOverrides = new Tile[9][];
            Tile[][]            maps          = new Tile[9][];
            List <ObjectTile>[] objectTiles   = new List <ObjectTile> [9];
            for (int i = 0; i < maps.Length; i++)
            {
                edgeOverrides[i] = new Tile[size];
                maps[i]          = new Tile[size];
                objectTiles[i]   = new List <ObjectTile>();
            }

            int[] suroundingGrids = CreateSuroundings(maps.Length, gridColumn, gridRow, gridsPerRow);

            StreamedTileMap streamedTileMap = new StreamedTileMap(this, tileRow, tileColumn, gridsPerRow, gridsPerRow, tilesPerColumn, tilesPerColumn, settings.TileSize);

            //Create Map
            foreach (LayerType currentLayerType in Enum.GetValues(typeof(LayerType)).Cast <LayerType>().OrderBy(k => (int)k))
            {
                for (int i = 0; i < suroundingGrids.Length; i++)
                {
                    AreaSpread[] layerAreas = areas.Where(a => a.Layer == currentLayerType).ToArray();
                    random = new Random(suroundingGrids[i] * settings.Seed);
                    for (int j = 0; j < layerAreas.Length; j++)
                    {
                        switch (layerAreas[j].Layer)
                        {
                        case LayerType.Height:
                        {
                            if (layerAreas[j].MaxSizeInMeter <= settings.MeterPerGrid / 2f)
                            {
                                CreateLayerOne(i, maps, edgeOverrides, (int)tilesPerGrid, (int)tilesPerGrid, settings.TileSize, settings.MeterPerTile, layerAreas[j], settings.RadiusOfCylinder);
                            }
                            else
                            {
                                throw new Exception("AreaSpread MaxSize must be smaller then (MetersPerGrid / 2)!");
                            }
                            break;
                        }

                        case LayerType.Biome:
                            CreateBiomeLayer(i, maps, layerAreas[j]);
                            break;

                        case LayerType.Paths:
                            CreateLayerFour();
                            break;

                        case LayerType.PointsOfInterest:
                        {
                            objectTiles[i].AddRange(CreateObjectLayer(maps[i], layerAreas[j], tilesPerColumn, tilesPerColumn));
                        }
                        break;
                        }
                    }
                }

                if (currentLayerType == LayerType.Height)
                {
                    //DefragementMap and add edgenoise
                    DefragmentMaps(maps, areas, suroundingGrids, (int)tilesPerGrid, (int)tilesPerGrid);

                    //Merge edgeOverrides
                    for (int k = 0; k < maps.Length; k++)
                    {
                        maps[k] = TileMathHelper.MergeMaps(maps[k], edgeOverrides[k]);
                    }
                }
            }

            CreateTileMapParts(maps, objectTiles, suroundingGrids, gridsPerRow, streamedTileMap);

            return(streamedTileMap);
        }
예제 #7
0
 /// <summary>
 /// Changes the map to a new streamed tile map (Tile map will be updated on the next update)
 /// </summary>
 /// <param name="map">New streamed tile map</param>
 public void ChangeMap(StreamedTileMap map)
 {
     newMap         = map;
     newMapAvalible = true;
 }