From 0e369307770f078350807ee8dee20b9b3a6fcda6 Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Mon, 30 May 2022 15:00:56 +0200 Subject: [PATCH] feat: reformat formation assignment toDo: fix middle squares not being taken --- theProject/Assets/Scripts/Entities/Entity.cs | 5 ++ theProject/Assets/Scripts/Formation.cs | 51 ++++++++++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/theProject/Assets/Scripts/Entities/Entity.cs b/theProject/Assets/Scripts/Entities/Entity.cs index 2a593dce..2424c302 100644 --- a/theProject/Assets/Scripts/Entities/Entity.cs +++ b/theProject/Assets/Scripts/Entities/Entity.cs @@ -30,6 +30,11 @@ public class Entity : MonoBehaviour return myTeam; } + public Vector2Int GetTileCoord() + { + return tileCoord; + } + // Start is called before the first frame update protected virtual void Start(){ healthPoints = maxHealthPoints; // initialize health diff --git a/theProject/Assets/Scripts/Formation.cs b/theProject/Assets/Scripts/Formation.cs index 8513659b..d1775e63 100644 --- a/theProject/Assets/Scripts/Formation.cs +++ b/theProject/Assets/Scripts/Formation.cs @@ -15,24 +15,55 @@ public class Formation : MonoBehaviour public Dictionary CalculatePositions(Vector2Int coordinates) { - List soldiers = squad.GetSoldiers(); + List soldiers = new List(squad.GetSoldiers()); Dictionary soldiersNewCoordinates = new Dictionary(); - int soldierNumber = 0; - int add = 1; - foreach (Entity Entity in soldiers) + + int numberOfSoldiers = soldiers.Count; + for(int i = numberOfSoldiers / 2; i >= 0; i--) { - soldiersNewCoordinates.Add(Entity, CalculateSoldierCoordinates(soldierNumber, coordinates, add)); - soldierNumber++; - add *= -1; + float shortestDistance = Mathf.Infinity; + Entity nearestSoldier = null; + Vector2Int newCoordinates = new Vector2Int(coordinates.x + i, coordinates.y); + foreach (Entity Entity in soldiers) + { + float distanceToTile = Vector2.Distance(Entity.GetTileCoord(), newCoordinates); + if (distanceToTile < shortestDistance) + { + shortestDistance = distanceToTile; + nearestSoldier = Entity; + } + } + if (nearestSoldier != null) + { + soldiersNewCoordinates.Add(nearestSoldier, newCoordinates); + soldiers.Remove(nearestSoldier); + } + shortestDistance = Mathf.Infinity; + nearestSoldier = null; + newCoordinates = new Vector2Int(coordinates.x - i, coordinates.y); + foreach (Entity Entity in soldiers) + { + float distanceToTile = Vector2.Distance(Entity.GetTileCoord(), newCoordinates); + if (distanceToTile < shortestDistance) + { + shortestDistance = distanceToTile; + nearestSoldier = Entity; + } + } + if (nearestSoldier != null) + { + soldiersNewCoordinates.Add(nearestSoldier, newCoordinates); + soldiers.Remove(nearestSoldier); + } } return soldiersNewCoordinates; } // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/in-parameter-modifier - private Vector2Int CalculateSoldierCoordinates(int soldierNumber, in Vector2Int coordinates,in int add) + private Vector2Int CalculateSoldierCoordinates(int soldierNumber, in Vector2Int coordinates) { - // Horizontal line we change x - soldierNumber = add * soldierNumber; + // Horizontal line we change x + if(soldierNumber % 2 == 1) soldierNumber = -1 * soldierNumber; TilemapManager.TileState tileState = TilemapManager.GetTileState(coordinates.x + soldierNumber, coordinates.y); if ( tileState == TilemapManager.TileState.free) {