diff --git a/scripts/entities/plants/RuntimePlantData.cs b/scripts/entities/plants/RuntimePlantData.cs index 82d0a01..a6ddd56 100644 --- a/scripts/entities/plants/RuntimePlantData.cs +++ b/scripts/entities/plants/RuntimePlantData.cs @@ -20,7 +20,7 @@ public partial class RuntimePlantData : Entity } public override void Kill() { - PoolContainer.Instance.EntityField[Resource.Layer].Remove(GlobalPosition); + PoolContainer.Instance.RemoveEntity(GlobalPosition, Resource.Layer); QueueFree(); } } diff --git a/scripts/gui/ShovelButton.cs b/scripts/gui/ShovelButton.cs index c1ba12e..4853b35 100644 --- a/scripts/gui/ShovelButton.cs +++ b/scripts/gui/ShovelButton.cs @@ -96,7 +96,7 @@ public partial class ShovelButton : TextureButton var checkedPosition = (position / FieldParams.Tile).Ceil() * FieldParams.Tile - new Vector2(20, 14); for (int i = FieldParams.LayersCount - 1; i >= 0; i--) { - if (PoolContainer.Instance.EntityField[i].TryGetValue(checkedPosition, out var entity) && entity is RuntimePlantData plantData) + if (PoolContainer.Instance.TryGetEntity(checkedPosition, out RuntimePlantData plantData,i)) { return plantData; } diff --git a/scripts/level/InitialPackedSceneSpawner.cs b/scripts/level/InitialPackedSceneSpawner.cs index 459ddce..f5e9a64 100644 --- a/scripts/level/InitialPackedSceneSpawner.cs +++ b/scripts/level/InitialPackedSceneSpawner.cs @@ -33,20 +33,20 @@ public partial class InitialPackedSceneSpawner : Node if (entity is RuntimeZombieData) { PoolContainer.Instance.Zombies.AddChild(node); - node.GlobalPosition = position + new Vector2(0,0.5f*FieldParams.TileHeight); + node.GlobalPosition = position + new Vector2(0, 0.5f * FieldParams.TileHeight); } else if (entity is RuntimePlantData plant) { PoolContainer.Instance.Plants.AddChild(plant); node.GlobalPosition = position; plant.Resource = GameRegistry.GetEntityByName(plant.Resource.GetInternalID()) as PlantResource; - PoolContainer.Instance.EntityField[plant.Resource.Layer].Add(plant.GlobalPosition, plant); + PoolContainer.Instance.TrySetEntity(plant.GlobalPosition, plant, plant.Resource.Layer); } else { PoolContainer.Instance.Structures.AddChild(entity); node.GlobalPosition = position; - PoolContainer.Instance.EntityField[1].Add(entity.GlobalPosition, entity); + PoolContainer.Instance.TrySetEntity(entity.GlobalPosition,entity,1); } } else diff --git a/scripts/level/PlantField.cs b/scripts/level/PlantField.cs index d54a11b..aac1a4b 100644 --- a/scripts/level/PlantField.cs +++ b/scripts/level/PlantField.cs @@ -59,7 +59,7 @@ public partial class PlantField : Node2D bool canPlace = _resource != null && inBoundary - && PoolContainer.Instance.EntityField[_resource.Layer].ContainsKey(expected_pos) == false + && PoolContainer.Instance.IsPositionVacant(expected_pos,_resource.Layer) && RuntimeLevelData.Instance.CheckSpendSun((int)_resource.Cost); // Setting visuals @@ -96,7 +96,7 @@ public partial class PlantField : Node2D plant.GlobalPosition = (_plantSetter.GlobalPosition / FieldParams.Tile).Ceil() * FieldParams.Tile - new Vector2(20, 14); plant.Resource = (PlantResource)_resource; - PoolContainer.Instance.EntityField[_resource.Layer].Add(plant.GlobalPosition, plant); + PoolContainer.Instance.TrySetEntity(plant.GlobalPosition,plant,_resource.Layer); RuntimeLevelData.Instance.SpendSun((int)_resource.Cost); diff --git a/scripts/level/PoolContainer.cs b/scripts/level/PoolContainer.cs index 4be8269..156d47e 100644 --- a/scripts/level/PoolContainer.cs +++ b/scripts/level/PoolContainer.cs @@ -24,39 +24,39 @@ public partial class PoolContainer : Node2D public static PoolContainer Instance { get; private set; } - public Dictionary[] EntityField = { new(), new(), new() }; + //public Dictionary[] EntityField = { new(), new(), new() }; + private readonly Entity[,] EntityField = new Entity[3,FieldParams.ColumnsCount * FieldParams.RowsCount]; public override void _EnterTree() { Instance = this; } - public bool TryGetEntity(Vector2 key, out Entity result, int layer = 1) + public bool TryGetEntity(Vector2 positionVector, out T result, int layer = 1) where T : Entity { - if (EntityField[layer].ContainsKey(key)) - { - result = EntityField[layer][key]; - } - else - { - result = null; - } - return EntityField[layer].ContainsKey(key) - && EntityField[layer][key] != null; - } - - public bool TryGetEntity(Vector2 key, out T result, int layer = 1) where T : class - { - if (EntityField[layer].ContainsKey(key)) - { - result = EntityField[layer][key] as T; - } - else - { - result = null; - } - return EntityField[layer].ContainsKey(key) - && EntityField[layer][key] != null + var position = VectorToIndex(positionVector); + result = EntityField[layer, position] as T; + return EntityField[layer,position] != null && result != null; } + public bool TrySetEntity(Vector2 positionVector, Entity whatToSet, int layer = 1) + { + var position = VectorToIndex(positionVector); + if (IsPositionVacant(positionVector, layer) == false) return false; + EntityField[layer, position] = whatToSet; + return true; + } + public bool IsPositionVacant(Vector2 positionVector, int layer = 1) + { + return EntityField[layer, VectorToIndex(positionVector)] == null; + } + public void RemoveEntity(Vector2 positionVector, int layer = 1) + { + EntityField[layer, VectorToIndex(positionVector)] = null; + } + public static int VectorToIndex(Vector2 vector) + { + var intedVec = (vector - FieldParams.LeftFieldBoundary) / FieldParams.Tile; + return (int)intedVec.X + (int)intedVec.Y * FieldParams.ColumnsCount; + } public void SpawnParticles(PackedScene particles, Vector2 position, float rotation = 0) { diff --git a/scripts/systems/static-data/FieldParams.cs b/scripts/systems/static-data/FieldParams.cs index 4eca66e..e3f0d26 100644 --- a/scripts/systems/static-data/FieldParams.cs +++ b/scripts/systems/static-data/FieldParams.cs @@ -7,6 +7,8 @@ public class FieldParams public const int TileWidth = 50; public const int TileHeight = 60; public const int LayersCount = 3; + public const int ColumnsCount = 9; + public const int RowsCount = 5; public static Vector2I LeftFieldBoundary = new(305, 76); public static Vector2I RightFieldBoundary = new(755, 376); public static readonly Vector2 Tile = new(TileWidth, TileHeight);