LunarInfantry/Assets/Scripts/PlayerEntityMovement.cs
2026-01-06 23:58:46 -08:00

187 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
public class PlayerEntityMovement : MonoBehaviour
{
//unsure if this should also move enemies but who knows!
#region Statication
public static PlayerEntityMovement instance;
private void Awake()
{
if (instance != null && instance != this)
{
Destroy(gameObject);
return;
}
instance = this;
}
#endregion
[SerializeField] private Grid gameplayGrid;
public Entity selectedEntity;
public GameObject templateObject;
public bool isMoving;
private Vector3 mouseWorldPos;
private Vector3 mouseGridPos;
private Camera cam;
private float debounceTime;
[SerializeField] private float debounceDuration;
private List<TileObject> currentMovableTiles = new();
private Queue<TileObject> frontier = new();
private HashSet<TileObject> visited = new();
private Dictionary<TileObject, TileObject> currentPaths = new();
public List<TileObject> pathRequested;
private TileObject requestedTile;
private void Start()
{
cam = Camera.main;
}
private void Update()
{
mouseWorldPos = cam.ScreenToWorldPoint(Input.mousePosition);
mouseGridPos = gameplayGrid.GetCellCenterWorld(gameplayGrid.WorldToCell(mouseWorldPos));
if (debounceTime > 0)
{
debounceTime -= Time.deltaTime;
}
if (isMoving)
{
if (Input.GetMouseButton(1))
{
Deselect();
}
TileObject newTile = GridManager.instance.GetTile(mouseGridPos);
if (requestedTile != newTile)
{
requestedTile = newTile;
foreach (TileObject tile in pathRequested)
{
tile.sprite.color = new Color(137,137,137);
}
PathfindToTarget();
}
templateObject.transform.position = mouseGridPos;
if (Input.GetMouseButtonDown(0) && debounceTime <= 0 && SelectLocation())
{
isMoving = false;
}
}
}
public void SelectEntity(Entity entitySelected)
{
selectedEntity = entitySelected;
isMoving = true;
debounceTime = debounceDuration;
UncolorGrid();
frontier.Clear();
visited.Clear();
currentPaths.Clear();
pathRequested.Clear();
GetAllTiles();
GetTilesInRange();
CreateTemplate();
}
private void UncolorGrid()
{
foreach (TileObject tileObject in currentMovableTiles)
{
tileObject.sprite.color = new Color(137,137,137);
}
}
private void GetAllTiles()
{
frontier.Enqueue(selectedEntity.currentTile);
while (frontier.Count > 0)
{
TileObject currentTile = frontier.Dequeue();
foreach (TileObject neighboringTiles in currentTile.neighbors)
{
if (!visited.Contains(neighboringTiles))
{
visited.Add(neighboringTiles);
frontier.Enqueue(neighboringTiles);
currentPaths.TryAdd(neighboringTiles, currentTile);
}
}
}
}
private void PathfindToTarget()
{
pathRequested.Clear();
TileObject currentTile = requestedTile;
while (currentTile != selectedEntity.currentTile)
{
pathRequested.Add(currentTile);
currentTile = currentPaths[currentTile];
}
pathRequested.Reverse();
foreach (TileObject tile in pathRequested)
{
tile.sprite.color = Color.blue;
}
}
private void GetTilesInRange()
{
foreach (TileObject neighboringTiles in selectedEntity.currentTile.neighbors)
{
if (!neighboringTiles.blocked && !neighboringTiles.hasUnit)
{
currentMovableTiles.Add(neighboringTiles);
neighboringTiles.sprite.color = Color.green;
}
}
for (int i = 0; i < selectedEntity.maxMovement - 1; i++)
{
foreach (TileObject tileObject in currentMovableTiles.ToArray())
{
foreach (TileObject neighboringTiles in tileObject.neighbors)
{
if (!neighboringTiles.blocked && !neighboringTiles.hasUnit)
{
currentMovableTiles.Add(neighboringTiles);
neighboringTiles.sprite.color = Color.green;
}
}
}
}
}
private bool SelectLocation()
{
if (!requestedTile || requestedTile.blocked || requestedTile.hasUnit || !currentMovableTiles.Contains(requestedTile))
{
return false;
}
selectedEntity.currentTile.hasUnit = false;
requestedTile.hasUnit = true;
StartCoroutine(selectedEntity.MoveToLocation(pathRequested.ToArray()));
templateObject.SetActive(false);
UncolorGrid();
return true;
}
private void Deselect()
{
isMoving = false;
}
private void CreateTemplate()
{
templateObject.SetActive(true);
templateObject.transform.position = mouseGridPos;
}
}