using System; using System.Collections.Generic; using System.Linq; using Actions; using UnityEngine; using UnityEngine.Serialization; namespace Grid { public class GridSystemVisual : MonoBehaviour { public enum GridVisualType { White, Red, Blue, Yellow, RedSoft } [FormerlySerializedAs("GridSystemVisualSinglePrefab")] [SerializeField] private Transform gridSystemVisualSinglePrefab; [FormerlySerializedAs("gridVisualTypeMaterials")] [SerializeField] private List gridVisualTypeMaterialList; private GridSystemVisualSingle[,] gridSystemVisualSingleArray; private static GridSystemVisual Instance { get; set; } private void Awake() { if (Instance is not null) { Debug.LogError($"There is more than one GridSystemVisual! {transform} - {Instance}"); Destroy(gameObject); return; } Instance = this; } private void Start() { int width = LevelGrid.Instance.GetWidth(); int height = LevelGrid.Instance.GetHeight(); gridSystemVisualSingleArray = new GridSystemVisualSingle[width, height]; for (int x = 0; x < width; x++) { for (int z = 0; z < height; z++) { Transform gridSystemVisualSingleTransform = Instantiate(gridSystemVisualSinglePrefab, LevelGrid.Instance.GetWorldPosition(new(x, z, 0)), Quaternion.identity); gridSystemVisualSingleArray[x, z] = gridSystemVisualSingleTransform.GetComponent(); } } UnitActionSystem.Instance.OnSelectedActionChanged += UnitActionSystem_OnSelectedActionChanged; LevelGrid.Instance.OnAnyUnitMovedGridPosition += LevelGrid_OnAnyUnitMovedGridPosition; UpdateGridVisual(); } private void LevelGrid_OnAnyUnitMovedGridPosition(object sender, EventArgs e) => UpdateGridVisual(); private void UnitActionSystem_OnSelectedActionChanged(object sender, EventArgs e) => UpdateGridVisual(); private void HideAllGridPosition() { foreach (GridSystemVisualSingle gridSystemVisualSingle in gridSystemVisualSingleArray) gridSystemVisualSingle.Hide(); } private void ShowGridPositionList(List gridPositionList, GridVisualType gridVisualType) { foreach (GridPosition gridPosition in gridPositionList) gridSystemVisualSingleArray[gridPosition.XPosition, gridPosition.ZPosition].Show(GetGridVisualTypeMaterial(gridVisualType)); } private void ShowGridPositionRange(GridPosition gridPosition, int range, GridVisualType gridVisualType) { List gridPositionList = new(); for (int x = -range; x <= range; x++) { for (int z = -range; z <= range; z++) { GridPosition testGridPosition = gridPosition + new GridPosition(x, z, 0); if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) continue; //Only return valid grid positions if (Mathf.Abs(x) + Mathf.Abs(z) > range) continue; //Out of Range gridPositionList.Add(testGridPosition); } } ShowGridPositionList(gridPositionList, gridVisualType); } private void ShowGridPositionRangeSquare(GridPosition gridPosition, int range, GridVisualType gridVisualType) { List gridPositionList = new(); for (int x = -range; x <= range; x++) { for (int z = -range; z <= range; z++) { GridPosition testGridPosition = gridPosition + new GridPosition(x, z, 0); if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) continue; //Only return valid grid positions gridPositionList.Add(testGridPosition); } } ShowGridPositionList(gridPositionList, gridVisualType); } private void UpdateGridVisual() { HideAllGridPosition(); BaseAction selectedAction = UnitActionSystem.Instance.SelectedAction; Unit selectedUnit = UnitActionSystem.Instance.SelectedUnit; GridVisualType gridVisualType; switch (selectedAction) { case SpinAction: gridVisualType = GridVisualType.Blue; break; case GrenadeAction: gridVisualType = GridVisualType.Yellow; break; case ShootAction: gridVisualType = GridVisualType.Red; ShowGridPositionRange(selectedUnit.GridPosition, selectedUnit.GetAction().MaxShootDistance, GridVisualType.RedSoft); break; case SwordAction: gridVisualType = GridVisualType.Red; ShowGridPositionRangeSquare(selectedUnit.GridPosition, selectedUnit.GetAction().MaxSwordDistance, GridVisualType.RedSoft); break; case InteractAction: gridVisualType = GridVisualType.Blue; break; default: gridVisualType = GridVisualType.White; break; } ShowGridPositionList(selectedAction.GetValidActionGridPositionList(), gridVisualType); } private Material GetGridVisualTypeMaterial(GridVisualType gridVisualType) { return (from gridVisualTypeMaterial in gridVisualTypeMaterialList where gridVisualTypeMaterial.gridVisualType == gridVisualType select gridVisualTypeMaterial.material).FirstOrDefault(); } [Serializable] public struct GridVisualTypeMaterial { public GridVisualType gridVisualType; public Material material; } } }