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); }