♻️ Optimizations of the various system
🍱 Retexture of the enemy portal
This commit is contained in:
@@ -43,11 +43,29 @@ public partial class GridManager : Node
|
||||
|
||||
public void FreeArea(Vector2I topLeft, Vector2I size, float rotation, GridLayer layer = GridLayer.Building)
|
||||
{
|
||||
// Get all cells that should be occupied by this building
|
||||
var occupiedCells = GridUtils.GetOccupiedCells(topLeft, size, rotation);
|
||||
foreach (var cell in occupiedCells)
|
||||
|
||||
// Create a list to store cells that should be removed
|
||||
var cellsToRemove = new List<Vector2I>();
|
||||
|
||||
// First, find all cells that match this building's position and size
|
||||
foreach (var cell in _layers[layer].Keys.ToList())
|
||||
{
|
||||
if (_layers[layer].ContainsKey(cell))
|
||||
_layers[layer].Remove(cell);
|
||||
var (building, buildingSize, buildingRotation) = _layers[layer][cell];
|
||||
var buildingCells = GridUtils.GetOccupiedCells(cell, buildingSize, buildingRotation);
|
||||
|
||||
// If any of the building's cells match our target area, mark all of its cells for removal
|
||||
if (buildingCells.Any(c => occupiedCells.Contains(c)))
|
||||
{
|
||||
cellsToRemove.AddRange(buildingCells);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove all marked cells
|
||||
foreach (var cell in cellsToRemove.Distinct())
|
||||
{
|
||||
_layers[layer].Remove(cell);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -55,15 +55,15 @@ public partial class NaturalResourceGenerator : Node2D
|
||||
return;
|
||||
}
|
||||
|
||||
// Test if enemy_nest is in the registry
|
||||
var testBuilding = Registry.GetBuilding("enemy_nest");
|
||||
// Test if enemy_portal is in the registry
|
||||
var testBuilding = Registry.GetBuilding("enemy_portal");
|
||||
if (testBuilding == null)
|
||||
{
|
||||
GD.PrintErr($"{LogPrefix} 'enemy_nest' is not found in BuildingRegistry!");
|
||||
GD.PrintErr($"{LogPrefix} 'enemy_portal' is not found in BuildingRegistry!");
|
||||
}
|
||||
else
|
||||
{
|
||||
GD.Print($"{LogPrefix} Found enemy_nest in registry!");
|
||||
GD.Print($"{LogPrefix} Found enemy_portal in registry!");
|
||||
}
|
||||
|
||||
GD.Print($"{LogPrefix} NaturalResourceGenerator ready, SpawnEnemyNest = {SpawnEnemyNest}");
|
||||
@@ -287,9 +287,9 @@ public partial class NaturalResourceGenerator : Node2D
|
||||
|
||||
// Remove all tiles in this chunk
|
||||
var chunkWorldPos = ChunkToWorldCoords(chunkPos);
|
||||
for (int x = 0; x < ChunkSize; x++)
|
||||
for (var x = 0; x < ChunkSize; x++)
|
||||
{
|
||||
for (int y = 0; y < ChunkSize; y++)
|
||||
for (var y = 0; y < ChunkSize; y++)
|
||||
{
|
||||
var cell = new Vector2I(chunkWorldPos.X + x, chunkWorldPos.Y + y);
|
||||
// Free a 1x1 area for each cell
|
||||
@@ -416,7 +416,7 @@ public partial class NaturalResourceGenerator : Node2D
|
||||
|
||||
while (attempts < maxAttempts)
|
||||
{
|
||||
if (PlaceTile("enemy_nest", nestPosition))
|
||||
if (PlaceTile("enemy_portal", nestPosition))
|
||||
{
|
||||
GD.Print($"{LogPrefix} Placed enemy nest at {nestPosition}");
|
||||
return;
|
||||
|
@@ -428,32 +428,28 @@ public static class GridManagerExtensions
|
||||
public static (Vector2I Position, Vector2I Size, float Rotation)? GetBuildingInfoAtCell(this GridManager grid,
|
||||
Vector2I cell, GridLayer layer)
|
||||
{
|
||||
if (grid.GetTileAtCell(cell, layer) is { } building)
|
||||
if (grid.GetTileAtCell(cell, layer) is not { } building) return null;
|
||||
// Find the top-left position of the building
|
||||
for (var x = 0; x < 100; x++) // Arbitrary max size
|
||||
{
|
||||
// Find the top-left position of the building
|
||||
for (int x = 0; x < 100; x++) // Arbitrary max size
|
||||
for (var y = 0; y < 100; y++)
|
||||
{
|
||||
for (int y = 0; y < 100; y++)
|
||||
{
|
||||
var checkCell = new Vector2I(cell.X - x, cell.Y - y);
|
||||
if (grid.GetTileAtCell(checkCell, layer) == building)
|
||||
{
|
||||
// Found the top-left corner, now find the size
|
||||
var size = Vector2I.One;
|
||||
// Search right
|
||||
while (grid.GetTileAtCell(new Vector2I(checkCell.X + size.X, checkCell.Y), layer) ==
|
||||
building)
|
||||
size.X++;
|
||||
// Search down
|
||||
while (grid.GetTileAtCell(new Vector2I(checkCell.X, checkCell.Y + size.Y), layer) ==
|
||||
building)
|
||||
size.Y++;
|
||||
var checkCell = new Vector2I(cell.X - x, cell.Y - y);
|
||||
if (grid.GetTileAtCell(checkCell, layer) != building) continue;
|
||||
// Found the top-left corner, now find the size
|
||||
var size = Vector2I.One;
|
||||
// Search right
|
||||
while (grid.GetTileAtCell(new Vector2I(checkCell.X + size.X, checkCell.Y), layer) ==
|
||||
building)
|
||||
size.X++;
|
||||
// Search down
|
||||
while (grid.GetTileAtCell(new Vector2I(checkCell.X, checkCell.Y + size.Y), layer) ==
|
||||
building)
|
||||
size.Y++;
|
||||
|
||||
// Get rotation from the first cell
|
||||
var rotation = 0f; // You'll need to store rotation in GridManager to make this work
|
||||
return (checkCell, size, rotation);
|
||||
}
|
||||
}
|
||||
// Get rotation from the first cell
|
||||
var rotation = 0f; // You'll need to store rotation in Grid to make this work
|
||||
return (checkCell, size, rotation);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user