示例#1
0
    public bool NextAction()
    {
        UnitController target = null;
        var            units  = _pM.PlayerInfo.Units;//.Where(u => u.gameObject.name != "P1_Unit_Melee (1)");

        int maxAttackRange = UnitController.MoveDistance + UnitController.MaxAttackDistance;
        int minAttackRange = UnitController.MinAttackDistance;

        List <UnitController> inRangeUnits = units.Where(u => u.Position.GridDistance(UnitController.Position) == UnitController.MaxAttackDistance).ToList();

        units = units.Except(inRangeUnits).ToList();
        List <UnitController> tooCloseUnits = units.Except(inRangeUnits).Where(u => u.Position.GridDistance(UnitController.Position) <= minAttackRange).ToList();

        units = units.Except(tooCloseUnits).ToList();
        List <UnitController> closeUnits = units.Except(inRangeUnits.Union(tooCloseUnits)).Where(u => u.Position.GridDistance(UnitController.Position) <= maxAttackRange).ToList();

        units = units.Except(closeUnits).ToList();
        List <UnitController> targets = units.Except(tooCloseUnits).ToList();

        if (inRangeUnits.Count > 0)
        {
            target = inRangeUnits.FirstOrDefault();
        }
        else if (tooCloseUnits.Count > 0)
        {
            target = tooCloseUnits.FirstOrDefault();
        }
        else if (closeUnits.Count > 0)
        {
            target = closeUnits.OrderBy(u => u.Position.GridDistance(UnitController.Position)).FirstOrDefault();
        }
        else if (targets.Count > 0)
        {
            target = targets.OrderBy(u => u.Position.GridDistance(UnitController.Position)).FirstOrDefault();
        }

        if (target != null)
        {
            if (UnitController.CheckAttack(target.CurrentGridBlock))
            {
                return(true);
            }

            GridBlock        gbTarget = null;
            List <GridBlock> moves    = null;
            var gbTargets             = target.CurrentGridBlock.GetRangeSpaces(UnitController.CurrentGridBlock, minAttackRange);

            if (gbTargets != null)
            {
                int pathLength = 99;
                foreach (var gB in gbTargets)
                {
                    var tempMoves = UnitManager.CreatePath(UnitController.CurrentGridBlock, gB);
                    if (tempMoves.Count() < pathLength)
                    {
                        pathLength = tempMoves.Count();
                        moves      = tempMoves.ToList();
                        gbTarget   = gB;
                    }
                }
            }

            if (gbTarget != null)
            {
                UnitController.Target = target.CurrentGridBlock;
                return(MoveToNextSpace(gbTarget, target, moves));
            }
        }

        return(false);
    }