예제 #1
0
    public void SpawnPlanetTiles()
    {
        if (_currentGridInfo == null)
        {
            return;
        }

        int   planetCount = 0;
        float tileSize    = _currentGridInfo.gameGridWorldBounds.size.x / _currentGridInfo.gameGridSize.x;

        // Get all empty tiles
        List <GridTile> allowedSpawnTiles = new List <GridTile>();

        for (int x = 0; x < _currentGridInfo.gameGridSize.x; x++)
        {
            for (int y = 0; y < _currentGridInfo.gameGridSize.y; y++)
            {
                if (_currentGridInfo.gameGridTiles[x, y].tileType == 0)
                {
                    allowedSpawnTiles.Add(_currentGridInfo.gameGridTiles[x, y]);
                }
            }
        }

        //// Remove tiles too close to deploy point
        //float castRadius = tileSize * minTilesBetweenDeployPoint;

        //foreach (var tile in DeployManager.instance.GetAllDeployTiles())
        //{
        //    Collider2D[] allHits = Physics2D.OverlapCircleAll(tile.TileCenter, castRadius, tileLayerMask);
        //    foreach (var hit in allHits)
        //    {
        //        GridTile candidate = hit.GetComponent<GridTile>();
        //        if (hit != null)
        //        {
        //            allowedSpawnTiles.Remove(candidate);
        //            //Debug.DrawLine(candidate.TileCenter, candidate.TileCenter + Vector2.up * 0.2f, Color.red, 5f);
        //        }
        //    }
        //}

        // Add heat to tiles near map edge
        foreach (var tile in allowedSpawnTiles)
        {
            bool addHeat = false;
            if (tile.tileX == 0 || tile.tileX == _currentGridInfo.gameGridSize.x - 1)
            {
                addHeat = true;
            }
            if (tile.tileY == 0 || tile.tileY == _currentGridInfo.gameGridSize.y - 1)
            {
                addHeat = true;
            }

            // Add heat as if a planet was on this tile
            if (addHeat)
            {
                tile.AddPlanetHeat(1);
            }
        }

        // Spawn planets
        for (int i = 0; i < planetTileCount; i++)
        {
            // Get best matching tiles
            float lowestHeat = float.MaxValue;
            int   heatMargin = 1;
            foreach (var tile in allowedSpawnTiles)
            {
                if (tile.PlanetHeat < lowestHeat)
                {
                    lowestHeat = tile.PlanetHeat;
                }
            }

            List <GridTile> lowestHeatTiles = new List <GridTile>();
            foreach (var tile in allowedSpawnTiles)
            {
                if (tile.PlanetHeat <= lowestHeat + heatMargin)
                {
                    lowestHeatTiles.Add(tile);
                }
            }

            if (lowestHeatTiles.Count <= 0)
            {
                Debug.Log("Error in calculating lowest heat tile.");
                break;
            }

            int      randomIndex = UnityEngine.Random.Range(0, lowestHeatTiles.Count);
            GridTile randomTile  = lowestHeatTiles[randomIndex];
            allowedSpawnTiles.Remove(randomTile);

            foreach (var neighbour in randomTile.AllNeighbours)
            {
                allowedSpawnTiles.Remove(neighbour);
            }

            // Add heat, one circle cast per heat distance
            for (int j = 1; j <= planetHeatDistance; j++)
            {
                float heatCastRadius = tileSize * j;

                Collider2D[] allHits = Physics2D.OverlapCircleAll(randomTile.TileCenter, heatCastRadius, tileLayerMask);
                foreach (var hit in allHits)
                {
                    GridTile candidate = hit.GetComponent <GridTile>();
                    if (hit != null)
                    {
                        candidate.AddPlanetHeat(1);
                    }
                }
            }

            if (GridManager.instance != null)
            {
                GridManager.instance.ReplaceTile(randomTile, 3);
            }

            foreach (var tile in _currentGridInfo.gameGridTiles)
            {
                // If same X
                if (tile.tileX == randomTile.tileX)
                {
                    // If not exact same tile
                    if (tile.tileY != randomTile.tileY)
                    {
                        // If neighbour
                        if (tile.tileY == randomTile.tileY - 1 || tile.tileY == randomTile.tileY + 1)
                        {
                            tile.AddPlanetHeat(2);
                        }
                        // If other
                        else
                        {
                            tile.AddPlanetHeat(1);
                        }
                    }
                }

                if (tile.tileY == randomTile.tileY)
                {
                    // If not exact same tile
                    if (tile.tileX != randomTile.tileX)
                    {
                        // If neighbour
                        if (tile.tileX == randomTile.tileX - 1 || tile.tileX == randomTile.tileX + 1)
                        {
                            tile.AddPlanetHeat(2);
                        }
                        // If other
                        else
                        {
                            tile.AddPlanetHeat(1);
                        }
                    }
                }
            }
            planetCount++;
        }
    }