anchor.diff:          {$ifdef LARGEINT}
             NodeAllocatorBuffers := Pointer(@Store.Info.NodeAllocator.Items);
             ChildNode := Pointer(
  -            (NodeAllocatorBuffers[NativeUInt(ChildNode) shr LARGE_NODEPTR_OFFSET]) +
  -            (NativeUInt(ChildNode) and NODEPTR_CLEAN_MASK) );
  +            (NodeAllocatorBuffers[ChildNodeInfo) shr LARGE_NODEPTR_OFFSET]) +
  +            (ChildNodeInfo and NODEPTR_CLEAN_MASK) );
           {$else}
  -          ChildNode := Pointer(NativeInt(ChildNode) and NODEPTR_CLEAN_MASK);
  +          ChildNode := Pointer(ChildNodeInfo and NODEPTR_CLEAN_MASK);
           {$endif}
  -
  +        ChildNodeInfo := ChildNode.NodeInfo and PARENT_BITS_CLEAR_MASK;
  +        ParentBits := ParentBits or ChildNodeInfo;
  +        if (ParentBits and (ChildNodeInfo shl 8) = 0) then
  +          goto nextchild_continue;
  +
  +        ChildNode.NodeInfo := ParentBits;
  +
  +      (*
           // continue if the path is shorter
           ChildPath := ChildNode.Path;
           if (Path >= ChildPath) then
  
positive.code:           // already node allocated and coordinates filled
            // need to fill path/parent and heuristics/way data
            {$ifdef LARGEINT}
              Cell.NodePtr := NativeUInt(NativeInt(ChildNode) + NODEPTR_MODIFIER - NODEPTR_FLAG_ALLOCATED);
            {$else}
              Cell.NodePtr := NativeUInt(ChildNode) + NODEPTR_FLAG_HEURISTED;
            {$endif}
            ChildNode.Path := Path;
            ChildNode.NodeInfo := ChildNodeInfo;
  
          heuristics_data:
            // (dX, dY) = ChildNode.Coordinates - Store.Info.FinishPoint;
            dX := Cardinal(ChildNode.Coordinates);
            dY := Word(dX);
            dX := dX shr 16;
            Mask := Cardinal(Store.Info.FinishPoint);
            dY := dY - Word(Mask);
            dX := dX - (Mask shr 16);
  
            // Way
            Mask := 2*Byte(dY > 0);
  
negative.code:       Cell := Store.Current.Cell;
        Inc(NativeInt(Cell), Store.Info.CellOffsets[Child]);
  
        // parent bits
        Child := (Child shl 2) + (NodeInfo and 2) + (NativeUInt(Cardinal(Store.Current.Coordinates)) and 1);
        ParentBits := PARENT_BITS[Child];
  
        // allocated new or use exists
        ChildNodeInfo := Cell.NodePtr;
        if (ChildNodeInfo and NODEPTR_FLAG_HEURISTED = 0) then
        begin
          if (ChildNodeInfo and NODEPTR_FLAG_ALLOCATED = 0) then
          begin
            // (parent:3, mask, parentmask, tile) + test
            ChildNodeInfo := ChildNodeInfo and Integer($ff00ff00);
            ParentBits := ParentBits or ChildNodeInfo;
            if (ParentBits and (ChildNodeInfo shl 8) = 0) then
              goto nextchild_continue;
  
            // path
            TileWeights := Store.Info.TileWeights[ParentBits and 1];
            Path := TileWeights[NodeInfo shr 24] + TileWeights[ParentBits shr 24];
            if (Path > PATHLESS_TILE_WEIGHT) then
              goto nextchild_continue;
            Path := Store.Current.Path + (Path shr 1);
  
            // allocate new node
            ChildNode := Store.Info.NodeAllocator.NewNode;
  
  