anchor.diff:      // length of cached node
       nLength := Node.SortValue;
     until (nLength >= NATTANABLE_LENGTH_LIMIT);
  -  Node := ParentNode;
  -  nLength := Node.SortValue;
   
     // cache: attainable <-- cached
  +  {$ifdef CPUX86}
  +  Cardinal(Cell) := nLength;
  +  {$else}
  +  NodeInfo := Node.NodeInfo;
  +  {$endif}
     repeat
       // parameters
       ParentNodeInfo := ParentNode.NodeInfo;
       SingleWeigths := {$ifdef CPUX86}Store.{$endif}SingleLineWeigths;
  -    Dec(nLength){increment};
  -    Inc(NativeInt(SingleWeigths), (ParentNodeInfo and (1 shl 3)) shl (10 - 3));
  -
  -    // length and distance
  -    ParentNode.nAttainableLength := nLength;
  +    Inc(NativeInt(SingleWeigths), (ParentNodeInfo and (1 shl 3){child}) shl (10 - 3));
  +
  +    // heuristics, length and distance
  +    Dec({$ifdef CPUX86}Cardinal(Cell){$else}nLength{$endif}){increment};
  +    ParentNode.Path := {$ifdef CPUX86}Cardinal(Cell){$else}nLength{$endif} - (ParentNode.SortValue - ParentNode.Path){heurisctics};
  +    ParentNode.nAttainableLength := {$ifdef CPUX86}Cardinal(Cell){$else}nLength{$endif};
       {$ifdef CPUX86}
         ParentNode.AttainableDistance := Node.AttainableDistance +
  -        HALF * (SingleWeigths[ParentNodeInfo shr 24] + SingleWeigths[NativeUInt(Node.NodeInfo) shr 24]);
  +        HALF * (SingleWeigths[ParentNodeInfo shr 24] + SingleWeigths[Node.NodeInfo shr 24]);
       {$else}
         W1 := SingleWeigths[ParentNodeInfo shr 24];
  -      W2 := SingleWeigths[NativeUInt(Node.NodeInfo) shr 24]);
  +      W2 := SingleWeigths[NodeInfo shr 24];
         ParentNode.AttainableDistance := Node.AttainableDistance + HALF * (W1 + W2);
  +      NodeInfo := ParentNodeInfo;
       {$endif}
   
       // next node
  
positive.code: end;
  
  procedure TTileMap.CacheAttainablePath(var StartPoint: TCPFStart; const FinishNode: PCPFNode);
  //label
  //  cell_parent;
  label
    cacheloop;
  type
    TSingleWeigths = array[0..255] of Single;
  const
  
negative.code:   {$endif}
    ParentNode := nil;
    repeat
      // remove node from list
      // store parent (prev field)
      Left := Node.Prev;
      Node.Prev := ParentNode;
      ParentNode{Right} := Node.Next;
      Left.Next := ParentNode{Right};
      ParentNode{Right}.Prev := Left;
  
      // child cell
      ParentNode := Node;
      Inc(NativeInt(Cell), CellOffsets[(NativeUInt(Node.NodeInfo) shr 3) and 7]);
  
      // cell node
      {$ifdef LARGEINT}
  