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++; } }