anchor.diff:        function IntSolutionAvoid(fOpponent:TKMUnit; HighestInteractionCount:integer):boolean;
         function IntSolutionSideStep(aPosition:TKMPoint; HighestInteractionCount:integer):boolean;
   
  +    function SteppedOnNewTile(KMUnit: TKMUnit): TActionResult;
       procedure ChangeStepTo(aPos: TKMPoint);
       procedure PerformExchange(ForcedExchangePos:TKMPoint);
       procedure IncVertex;
  
positive.code: var
    DX,DY:shortint;
    WalkX,WalkY,Distance:single;
    PreviousAction:TUnitAction;
  begin
    Result := ActContinues;
    StepDone := false;
    fDoesWalking := false; //Set it to false at start of update
  
    //Happens whe e.g. Serf stays in front of Store and gets Deliver task
    if KMSamePoint(fWalkFrom,fWalkTo) then begin
      Result := ActDone;
      exit;
    end;
  
    //Route was not built
    if NodeList.Count = 0 then begin
      Result := ActAborted;
      exit;
    end;
  
    //Walk complete - NodePos cannot be greater than NodeCount (this should not happen, cause is unknown but for now this check stops crashes)
    if NodePos > NodeList.Count then begin
      if KMStepIsDiag(fWalker.PrevPosition,fWalker.NextPosition) then DecVertex; //Unoccupy vertex
      fWalker.IsExchanging := false; //Disable sliding (in case it was set in previous step)
      Result := ActDone;
      exit;
    end;
  
    //Execute the route in series of moves
  
negative.code:   //Check if unit has arrived on tile
    if KMSamePointF(fWalker.PositionF, KMPointF(NodeList.List[NodePos]), Distance/2) then
    begin
      Result := SteppedOnNewTile(KMUnit);
      if Result <> ActContinues then
        Exit;
    end;
  
    fWaitingOnStep := False;
  
    if NodePos>NodeList.Count then
      raise ELocError.Create('WalkTo overrun',fWalker.GetPosition);
  