anchor.diff:      function ForwardFF(): Boolean;
     public
       //D_INIT_FLOOD, D_FF_INIT_ARR, D_FF_INIT_FLOOD: TKMWordArray;
  -    BestDefLines: TKMDefenceLines;
  -    FirstLine: Word;
   
       constructor Create(aSorted: Boolean = False); reintroduce;
       destructor Destroy(); override;
   
  +    property FirstLine: Word read fFirstLine;
  +    property BestDefLines: TKMDefenceLines read fBestDefLines;
  +
       function FindDefenceLines(aOwner: TKMHandIndex; var aDefLines: TKMDefenceLines): Boolean;
       function FindDefensivePolygons(aOwner: TKMHandIndex; var aBaseCnt: Word; var aDefPosArr: TKMDefencePosArr; aMinDefeces: Boolean = True): Boolean;
  -
  +    function FindTeamDefences(var aOwners: TKMHndIdxArray; var aDefPosReq: TKMWordArray; var aTeamDefPos: TKMTeamDefPos): Boolean;
       //procedure DEBUG();
     end;
   
  
positive.code: // Prepare new Queue
  procedure TForwardFF.MakeNewQueue();
  begin
    fVisitedIdx := fVisitedIdx + 3; // There is 1 FF forward, 1 FF backward and 1 FF for positioning in 1 cycle; filter have its own array
    // Check length
    if (Length(fQueueArray) < Length(gAIFields.NavMesh.Polygons)) then
    begin
      SetLength(fQueueArray, Length(gAIFields.NavMesh.Polygons));
      SetLength(fDefInfo, Length(gAIFields.NavMesh.Polygons));
      fBackwardFF.UpdatePointers(fDefInfo, fQueueArray);
      ClearVisitIdx();
    end;
    // Reset VisitIdx if needed
    if (fVisitedIdx >= High(Byte)-3) then
      ClearVisitIdx();
    // Init also backward FF
    fBackwardFF.NewQueue(fVisitedIdx+1);
  end;
  
negative.code:   // Determine first line (divided by count of allies - it is rought because allies can have different size of defensive line but better than nothing)
    aFirstLine := Round(aFirstLine / AllianceCnt);
  
    SetLength(fDefPosArr, Cnt);
    Result := True;
  end;
  
  