anchor.diff:      function GetGroupByMember(aUnit: TKMUnitWarrior): TKMUnitGroup;
       function HitTest(X,Y: Integer): TKMUnitGroup;
       function GetClosestGroup(aPoint: TKMPoint; aTypes: TGroupTypeSet = [Low(TGroupType)..High(TGroupType)]): TKMUnitGroup;
  +    function GetGroupsInRadius(aPoint: TKMPoint; aRadius: Single; aTypes: TGroupTypeSet = [Low(TGroupType)..High(TGroupType)]): TKMUnitGroupArray;
   
       function WarriorTrained(aUnit: TKMUnitWarrior): TKMUnitGroup;
   
  
positive.code: end;
  
  
  function TKMUnitGroups.GetGroupsInRadius(aPoint: TKMPoint; aTypes: TGroupTypeSet = [Low(TGroupType)..High(TGroupType)]): TKMUnitGroup;
  var
    I: Integer;
    BestDist, Dist: Single;
  begin
    Result := nil;
    BestDist := MaxSingle; //Any distance will be closer than that
    for I := 0 to Count - 1 do
      if (Groups[I].GroupType in aTypes) and not Groups[I].IsDead then
      begin
        Dist := KMLengthSqr(Groups[I].GetPosition, aPoint);
        if Dist < BestDist then
        begin
          BestDist := Dist;
          Result := Groups[I];
        end;
      end;
  end;
  
negative.code: 
  type
    TKMUnitGroup = class;
    TKMUnitGroupArray = array of TKMUnitGroup;
    TKMUnitGroupEvent = procedure(aGroup: TKMUnitGroup) of object;
    TKMTurnDirection = (tdNone, tdCW, tdCCW);
    TKMInitialOrder = (ioNoOrder, ioSendGroup, ioAttackPosition);
  