public List <F.Tuple <float, BaseUnitState> > GetNearestUnitTuples(NearestUnit parameters, Func <BaseUnitState, bool> filter) { // Try preference first var pos = parameters.SearchFrom; var maxDistance = parameters.MaxDistance; var laneKey = parameters.LaneKey; var listOfTuples = new List <F.Tuple <float, BaseUnitState> >(); // Check against other units in lane var units = _unitsByLane[laneKey]; var a = F.Reduce((accum, value) => { if (filter(value) == false) { return(accum); } var dist = Vector2.Distance(pos, value.Position); if (dist > maxDistance) { return(accum); } accum.Add(new F.Tuple <float, BaseUnitState>(dist, value)); return(accum); }, listOfTuples, units); return(a.ToList()); }
public BaseUnitState GetNearestUnit(NearestUnit parameters, Func <BaseUnitState, bool> filter) { var a = GetNearestUnitTuples(parameters, filter); var preferredId = parameters.PreferredId; if (preferredId != null && a.Any(t => t.Second.Id == preferredId)) { return(GetUnitById(preferredId)); } var b = a.OrderBy(x => x.First); return(a.Count > 0 ? b.First().Second : null); }
public BaseUnitState GetNearestUnit(BaseUnitState fromUnit, float distance) { var q = new NearestUnit { LaneKey = fromUnit.LaneKey, MaxDistance = distance, PreferredId = fromUnit.TargetId, SearchFrom = fromUnit.Position }; return(GetNearestUnit(q, unit => { return unit.Id != fromUnit.Id && unit.Side != fromUnit.Side && unit.UnitType != UnitType.ControlPoint; })); }