anchor.diff:    // nothing is changed case
     if (Flags = 0) then
     begin
  -    if (Byte(FActualInfo.FoundPath.FullPath) >= Byte(FullPath)) then goto fill_result
  +    if (Byte(FActualInfo.FoundPath.FullPath) >= Byte(Store.FullPath)) then goto fill_result
       else
       goto nodes_initialized;
     end;
  -  Flags := Flags and not Integer(FLAG_STARTS);
  -  if (Flags = 0{start points changed only} {ToDo: excludes???}) then goto nodes_initialized;
  -
  -(*
  -  FLAG_CACHING = (1 shl 0);
  -  FLAG_FINISH = (1 shl 1);
  -  FLAG_CLEAN = (1 shl 2);
  -  FLAG_TILES = (1 shl 3);
  -  FLAG_EXCLUDES = (1 shl 4);
  -  FLAG_WEIGHTS = (1 shl 5);
  -  FLAG_HEURISTICS = (1 shl 6);
  -  FLAG_STARTS = (1 shl 7);
  -*)  
  +  if (Flags = FLAG_STARTS{start points changed only}) then goto nodes_initialized;
   
     // cleanup initialized node pools (contains NODEPTR_FLAG_HEURISTED)
     if (Flags and FLAG_CLEAN = 0) then
     begin
  -    //Flags := Flags or FLAG_STARTS;
  -
  -    
  -  
  -    // attainable points (+ hot)
  -    if (Flags <> 0) then
  -    begin
  -      // hot pool has attainable nodes case
  -      // move nodes to the heuristed pool and reinitialize fields
  -      if (FNodes.HotPool.First.Next <> @FNodes.HotPool.Last) and
  -        (not FNodes.HotPool.Unattainable) then
  -        FlushHotPoolNodes;
  -
  -      if (FNodes.AttainableTree) then
  -        ForgetAttainableTreeNodes;
  +    // attainable points
  +    if (Flags and FLAGS_ATTAINABLE_NODES <> 0) and (FNodes.AttainableTree) then
  +      ForgetAttainableTreeNodes;
  +
  +    // excluded points
  +    if (Flags and FLAGS_EXCLUDED_POOL <> 0) and
  +      (FNodes.ExcludedPool.First.Next <> @FNodes.ExcludedPool.Last) then
  +    begin
  +      if (Flags and (FLAGS_HEURISTED_POOL and FLAGS_UNATTAINABLE_POOL) <> 0) then
  +      begin
  +        ReleasePoolNodes(FNodes.ExcludedPool.First, FNodes.ExcludedPool.Last);
  +      end else
  +      begin
  +        UnlockExcludedNodes;
  +      end;
       end;
   
       // heuristed pool (+ excluded + hot)
  -    if (Flags and (FLAG_CACHING or FLAG_FINISH or FLAG_HEURISTICS) <> 0) then
  +    if (Flags and FLAGS_HEURISTED_POOL <> 0) then
       begin
         if (FNodes.HeuristedPool.First.Next <> @FNodes.HeuristedPool.Last) then
           ReleasePoolNodes(FNodes.HeuristedPool.First, FNodes.HeuristedPool.Last);
  -
  -      if (FNodes.ExcludedPool.First.Next <> @FNodes.ExcludedPool.Last) then
  -        ReleasePoolNodes(FNodes.ExcludedPool.First, FNodes.ExcludedPool.Last);
   
         if (FNodes.HotPool.First.Next <> @FNodes.HotPool.Last) and
           (not FNodes.HotPool.Unattainable) then
  
positive.code:   if (CellInfo and NODEPTR_FLAG_ALLOCATED <> 0) then
    begin
      {$ifdef LARGEINT}
      NodeBuffers := Pointer(@FInfo.NodeAllocator.Buffers);
      {$endif}
      CellInfo := PCPFNode(
                {$ifdef LARGEINT}NodeBuffers[CellInfo shr LARGE_NODEPTR_OFFSET] +{$endif}
  
negative.code:   ResultPath.Distance := FActualInfo.FoundPath.Distance;
    if (ResultPath.Count = 0) then
      ResultPath.Points := nil;
  {$ifNdef CPUX86}
  end;
  {$endif}
  end;
  
  function TTileMap.FindPath(const Params: TTileMapParams; const FullPath: Boolean): TTileMapPath;
  