anchor.diff:    FLAG_SECTORS = (1 shl 4);
     FLAG_EXCLUDED = (1 shl 5);
     FLAG_WEIGHTS = (1 shl 6);
  +  FLAG_HEURISTICS = (1 shl 7);
   
     CHANGED_FINISH_INTERVAL = 8;
   label
  -  path_found, path_not_found, fill_result;
  +  weights_flags, path_found, path_not_found, fill_result;
   var
     i: NativeUInt;
     MapWidth, MapHeight: Cardinal;
  
positive.code:   FActualInfo.FoundPath.Distance := 0;
    if (FinishSector = SECTOR_PATHLESS) then goto fill_result;
  
    // initialize excluded points
    if (Flags and (FLAG_EXCLUDED or FLAG_CLEAN) <> 0) then
    begin
      // Excluded.NodeList
      // todo
  
      S := Params.Excludes;
      for i := Params.ExcludesCount downto 1 do
      begin
        Node := AllocateHeuristedNode(S.X, S.Y);
        Node.ParentMask := 0{locked flag};
  
        Inc(S);
      end;
    end;
  
    // finish point node
  
negative.code:     FActualInfo.FoundPath.FullPath := True;
      // Alloc(Length * SizeOf(TPoint))
      NodeInfo := FActualInfo.FoundPath.Length * SizeOf(TPoint);
      if (NodeInfo > FActualInfo.FoundPath.Buffer.FAllocatedSize) then FActualInfo.FoundPath.Buffer.Realloc(NodeInfo);
      FillAttainablePath(BestStartPoint.Node, FinishNode);
    end else
    begin
      FActualInfo.FoundPath.FullPath := False;
      // Alloc(2 * SizeOf(TPoint))
      NodeInfo := 2 * SizeOf(TPoint);
      if (NodeInfo > FActualInfo.FoundPath.Buffer.FAllocatedSize) then FActualInfo.FoundPath.Buffer.Realloc(NodeInfo);
  
      S := FActualInfo.FoundPath.Buffer.Memory;
      S.X := BestStartPoint.X;
  