public void Select(InputAction.CallbackContext context) { if (!context.performed) { return; } if (CursorState == Enums.CursorState.Default && CurrentUnit != null) { CursorState = Enums.CursorState.Selected; _orgGridBlock = CurrentGridBlock; if (Position == CurrentUnit.Position) { if (!CurrentUnit.Moved) { _startPos = transform.position; } SelectUnit(true); _aS.Play(Sound_Select); CurrentGridBlock.UseMoveAnimation = true; InitializeGrid(CurrentGridBlock); _moves = new List <GridBlock>() { CurrentGridBlock }; } } else if (CursorState == Enums.CursorState.Selected && CurrentGridBlock.ActiveSpace == Enums.ActiveSpace.Move && (CurrentGridBlock.CurrentUnit == null || !CurrentGridBlock.CurrentUnit.AtDestination)) { _pM.ActiveGrid_Hide(); CursorState = Enums.CursorState.OnlyAttack; _pM.ResetBlockGrid(); CurrentGridBlock.UseMoveAnimation = false; InitializeGrid(CurrentGridBlock); _aS.Play(Sound_Select); } else if (CursorState == Enums.CursorState.OnlyAttack && CurrentGridBlock.ActiveSpace == Enums.ActiveSpace.Move) { CurrentUnit.MoveTo(_moves); _aS.Play(Sound_Attack); SelectUnit(false); ResetCursor(); } else if (CursorState == Enums.CursorState.Attack) { var bestGrid = FirstAvaiableGridBlock(); if (bestGrid == null) { return; } else { _moves.RemoveAllAfter(bestGrid); } CurrentUnit.Target = CurrentGridBlock; CurrentUnit.MoveTo(_moves, true); _aS.Play(Sound_Attack); SelectUnit(false); ResetCursor(); } else if (CursorState == Enums.CursorState.OnlyAttack) { CurrentUnit.Target = CurrentGridBlock; CurrentUnit.MoveTo(_moves, false); _aS.Play(Sound_Attack); SelectUnit(false); ResetCursor(); } //else if (!CurrentUnit.Moving && /*!CurrentUnit.Moved &&*/ transform.position.V2() != _startPos && CurrentGridBlock.ActivePlayerSpace != Enums.ActiveSpace.Inactive && // (CurrentGridBlock.IsCurrentUnitEnemy(Player) || // (CurrentGridBlock.ActivePlayerSpace == Enums.ActiveSpace.Move && CurrentGridBlock.CurrentUnit == null) //|| // /*(_attackSpace && (CurrentGridBlock.CurrentUnit == null || CurrentGridBlock.IsCurrentUnitEnemy(Player)))*/ // )) //{ // List<GridBlock> backupSpaces = null; // var target = CurrentGridBlock; // double dis = 9999; // if (target.CurrentUnit != null)// || _attackSpace) // { // dis = target.Position.GridDistance(CurrentUnit.Position); // CurrentUnit.Target = target; // } // if (target.CurrentUnit == null && _moves?.Count > 1)// && !_attackSpace) // { // CurrentUnit.MoveTo(_moves); // } // else if (!CurrentUnit.Attacked) // If the unit has not attacked yet, check attack options // { // If attacking an empty space, subtrack a move because the cursor created a move to reach that space // if (!CurrentUnit.Attacked && // ((dis >= CurrentUnit.MinAttackDistance && dis <= CurrentUnit.MaxAttackDistance) /*|| (_attackSpace && dis <= CurrentUnit.MaxAttackDistance)*/) && // _moves?.Count /*- (_attackSpace ? 1 : 0)*/ <= CurrentUnit.MaxAttackDistance) // If the unit is already in range of the target, // { // _aS.Play(Sound_Attack); // CurrentUnit.CheckAttack(target, false);// _attackSpace); // } // else if (_moves?.Count > 1) // If the unit needs to move to attack // { // double lastPosDis = _moves.Last().Position.GridDistance(target.Position); // if (lastPosDis < CurrentUnit.MinAttackDistance) // { // var lastGrid = _moves.Last(); // var orderedN = lastGrid.Neighbors.OrderByDistance(_orgGridBlock, true); // var canMoveTo = orderedN.Where(n => n.ActiveSpace(Player) == Enums.ActiveSpace.Move).ToList(); // var newTargetGrid = canMoveTo.FirstOrDefault(); // if (newTargetGrid != null && _moves.Contains(newTargetGrid)) // { // int index = _moves.IndexOf(newTargetGrid) + 1; // Erase everything higher than the selected grid // if (index <= _moves.Count()) // _moves.RemoveRange(index, _moves.Count() - index); // } // else if (newTargetGrid != null) // { // _moves.Add(newTargetGrid); // } // else if (newTargetGrid == null) // { // CurrentUnit.Target = null; // return; // } // } // if (_moves?.Count > 0) // { // CurrentUnit.MoveTo(_moves); // } // } // } // else if ((backupSpaces = _orgGridBlock.AvailableAttackSpace(CurrentGridBlock, CurrentUnit.MaxAttackDistance).ToList()).Count > 0) // If the unit is too close to attack but there is room for it back up and attack // { // _aS.Play(Sound_Attack); // CurrentUnit.MoveTo(new List<GridBlock>() { _orgGridBlock, backupSpaces.First() }); // } // else // If non of the other conditions are met, then do nothing. // { // CurrentUnit.Target = null; // return; // } // if (CurrentUnit.Target != null && ((target.CurrentUnit != null && target.CurrentUnit.IsEnemy(Player))))// || _attackSpace)) // { // _aS.Play(Sound_Attack); // SelectUnit(false); // ResetCursor(); // } //} //else if ((CurrentUnit.Moving || CurrentUnit.Moved) && CurrentGridBlock.IsCurrentUnitEnemy(Player)) //{ // _aS.Play(Sound_Attack); // CurrentUnit.Target = CurrentGridBlock; // SelectUnit(false); // ResetCursor(); //} //else if ((CurrentUnit.Moving || CurrentUnit.Moved)) //{ // _aS.Play(Sound_Attack); // SelectUnit(false); // ResetCursor(); //} }