using System; using Actions; using Grid; using UnityEngine; public class Unit : MonoBehaviour { private const int ACTION_POINTS_MAX = 2; private int actionPoints = ACTION_POINTS_MAX; [SerializeField] private bool isEnemy; public GridPosition GridPosition { get; private set; } public MoveAction MoveAction { get; private set; } public SpinAction SpinAction { get; private set; } public BaseAction[] BaseActionArray { get; private set; } public int ActionPoints { get => actionPoints; private set { actionPoints = value; OnAnyActionPointsChanged?.Invoke(this, EventArgs.Empty); } } public bool IsEnemy => isEnemy; private void Awake() { MoveAction = GetComponent(); SpinAction = GetComponent(); BaseActionArray = GetComponents(); } private void Start() { GridPosition = LevelGrid.Instance.GetGridPosition(transform.position); LevelGrid.Instance.AddUnitAtGridPosition(GridPosition, this); TurnSystem.Instance.OnTurnChanged += TurnSystem_OnTurnChanged; } private void Update() { GridPosition newGridPosition = LevelGrid.Instance.GetGridPosition(transform.position); if (newGridPosition == GridPosition) return; LevelGrid.Instance.UnitMovedGridPosition(this, GridPosition, newGridPosition); GridPosition = newGridPosition; } public static event EventHandler OnAnyActionPointsChanged; private void TurnSystem_OnTurnChanged(object sender, EventArgs e) { if (IsEnemy ^ TurnSystem.Instance.IsPlayerTurn || TurnSystem.Instance.IsPlayerTurn ^ IsEnemy) { ActionPoints = ACTION_POINTS_MAX; } } public bool TrySpendActionPointsToTakeAction(BaseAction baseAction) { if (!CanSpendActionPointsToTakeAction(baseAction)) return false; SpendActionPoints(baseAction.GetActionPointsCost()); return true; } private bool CanSpendActionPointsToTakeAction(BaseAction baseAction) => ActionPoints >= baseAction.GetActionPointsCost(); private void SpendActionPoints(int amount) => ActionPoints -= amount; public void Damage() => Debug.Log($"{transform} damaged!"); public Vector3 GetWorldPosition() => transform.position; }