Пример #1
0
    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());
    }
Пример #2
0
    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);
    }
Пример #3
0
    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;
        }));
    }