WUT_Computer_Science/Programming/E-PSYOPS/theProject/Assets/Scripts/Formation.cs

130 lines
4.7 KiB
C#
Raw Permalink Normal View History

2022-05-23 17:36:25 +02:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
2022-05-23 17:55:37 +02:00
2022-05-23 17:36:25 +02:00
public class Formation : MonoBehaviour
{
2022-05-30 13:13:39 +02:00
[SerializeField] Squad squad;
2022-05-23 17:36:25 +02:00
void Awake()
{
squad = GetComponent<Squad>();
2022-05-23 17:36:25 +02:00
}
public Dictionary<Entity, Vector2Int> CalculatePositions(Vector2Int coordinates)
2022-05-23 17:36:25 +02:00
{
List<Entity> soldiers = new List<Entity>(squad.GetSoldiers());
Dictionary<Entity, Vector2Int> soldiersNewCoordinates = new Dictionary<Entity, Vector2Int>();
2022-06-03 13:51:30 +02:00
bool isEven = false;
2022-06-03 13:51:30 +02:00
if(soldiers.Count % 2 == 0)
2022-05-23 17:36:25 +02:00
{
2022-06-03 13:51:30 +02:00
isEven = true;
float shortestDistance = Mathf.Infinity;
Entity nearestSoldier = null;
2022-06-03 13:51:30 +02:00
Vector2Int newCoordinates = new Vector2Int(coordinates.x, 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);
}
2022-06-03 13:51:30 +02:00
}
int numberOfSoldiers = soldiers.Count;
/* numberOfSoldiers = 4
i = 4 / 2
i = 2
soldier.Count = 2
i = 3
i = 3 / 2 = 1
sol
*/
if(isEven)
{
for(int i = numberOfSoldiers; i >= 0; i-=2)
{
2022-06-03 13:51:30 +02:00
soldiersNewCoordinates = CalculateNewCoordinates(soldiersNewCoordinates, soldiers, coordinates, i);
}
2022-06-03 13:51:30 +02:00
}else{
for(int i = numberOfSoldiers / 2; i >= 0; i--)
{
2022-06-03 13:51:30 +02:00
soldiersNewCoordinates = CalculateNewCoordinates(soldiersNewCoordinates, soldiers, coordinates, i);
}
2022-05-23 17:36:25 +02:00
}
return soldiersNewCoordinates;
2022-05-23 17:36:25 +02:00
}
2022-06-03 13:51:30 +02:00
private Dictionary<Entity, Vector2Int> CalculateNewCoordinates(Dictionary<Entity, Vector2Int> soldiersNewCoordinates, List<Entity> soldiers, Vector2Int coordinates, int i)
{
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;
}
2022-05-23 17:36:25 +02:00
// https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/in-parameter-modifier
private Vector2Int CalculateSoldierCoordinates(int soldierNumber, in Vector2Int coordinates)
2022-05-23 17:36:25 +02:00
{
// Horizontal line we change x
if(soldierNumber % 2 == 1) soldierNumber = -1 * soldierNumber;
2022-05-30 13:13:39 +02:00
TilemapManager.TileState tileState = TilemapManager.GetTileState(coordinates.x + soldierNumber, coordinates.y);
if ( tileState == TilemapManager.TileState.free)
{
Vector2Int soldierCoordinates = new Vector2Int(coordinates.x + soldierNumber, coordinates.y);
return soldierCoordinates;
} else if (tileState == TilemapManager.TileState.taken)
{
Vector2Int soldierCoordinates = new Vector2Int(coordinates.x, coordinates.y);
return soldierCoordinates;
} else
{
Vector2Int soldierCoordinates = new Vector2Int(coordinates.x, coordinates.y);
return soldierCoordinates;
}
2022-05-23 17:36:25 +02:00
}
2022-05-23 17:36:25 +02:00
}