anchor.diff:    and (((HighestInteractionCount >= EXCHANGE_TIMEOUT) and (fInteractionStatus <> kis_Pushed)) or //When pushed this timeout/counter is different
        (fInteractionStatus = kis_Pushed)) then //If we get pushed then always try exchanging (if we are here then there is no free tile)
     begin //Try to exchange with the other unit if they are willing
  +
  +    //We must alert the opponent to our presence because it looks bad when you exchange places
  +    //with the enemy instead of fighting them.
  +    //CheckAlliance is for optimisation since pushing allies doesn't matter
  +    if (fOpponent is TKMUnitWarrior)
  +    and (fPlayers.CheckAlliance(fOpponent.GetOwner, fUnit.GetOwner) = at_Enemy)
  +    and TKMUnitWarrior(fOpponent).CheckForEnemy then
  +      Exit;
  +
       //If Unit on the way is walking somewhere and not exchanging with someone else
       if (fOpponent.GetUnitAction is TUnitActionWalkTo)
       and (not TUnitActionWalkTo(fOpponent.GetUnitAction).fDoExchange)
  
positive.code:   KM_UnitActionGoInOut, KM_UnitActionStay,
    KM_Units_Warrior, KM_Log, KM_Resource;
  
  
  { TUnitActionWalkTo }
  constructor TUnitActionWalkTo.Create( aUnit: TKMUnit;
  
negative.code:   TTargetDiedCheck = (tc_NoChanges, tc_TargetUpdated, tc_Died);
    TObstacleCheck = (oc_NoObstacle, oc_ReRouteMade, oc_NoRoute);
  
    TUnitActionWalkTo = class(TUnitAction)
    private
      fWalkFrom:TKMPoint; //Walking from this spot, used only in Create
  