Beispiel #1
0
    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();
        //}
    }