anchor.diff:      fMyControls.MouseUp(X,Y,Shift,Button) // That will update control States, f.e.
     else
     if   (fMyControls.CtrlOver <> Image_DirectionCursor)
  -    and not SelectingTroopDirection then
  +    and not fSelectingTroopDirection then
     begin
       fMyControls.MouseUp(X,Y,Shift,Button);
       Exit;
  
positive.code: 
    if gGame.IsPaused and (fUIMode in [umSP, umMP]) then Exit;
  
    if SelectingTroopDirection then
    begin
      deltaX := X - SelectingDirPosition.X;
      deltaY := Y - SelectingDirPosition.Y;
      deltaDistanceSqr := Sqr(deltaX) + Sqr(deltaY);
      // Manually force the cursor to remain within a circle (+2 to avoid infinite loop due to rounding)
      if deltaDistanceSqr > Sqr(DIR_CURSOR_CIRCLE_RAD + 2) then
      begin
        deltaX := Round(deltaX / Sqrt(deltaDistanceSqr) * DIR_CURSOR_CIRCLE_RAD);
        deltaY := Round(deltaY / Sqrt(deltaDistanceSqr) * DIR_CURSOR_CIRCLE_RAD);
        newPoint := gMain.ClientToScreen(SelectingDirPosition);
        newPoint.X := newPoint.X + deltaX;
        newPoint.Y := newPoint.Y + deltaY;
        SetCursorPos(newPoint.X, newPoint.Y);
      end;
  
      // Compare cursor position and decide which direction it is
      SelectedDirection := KMGetDirection(deltaX, deltaY, DIR_CURSOR_NA_RAD);
      // Update the cursor based on this direction and negate the offset
      DirectionCursorShow(SelectingDirPosition.X, SelectingDirPosition.Y, SelectedDirection);
      gRes.Cursors.Cursor := kmcInvisible; // Keep it invisible, just in case
      Exit;
    end;
  
negative.code:             end
              else
              // Ensure down click was successful (could have been over a mountain, then dragged to a walkable location)
              if fSelectingTroopDirection and group.CanWalkTo(P, 0) then
              begin
                gGame.GameInputProcess.CmdArmy(gicArmyWalk, group, P, fSelectedDirection);
                gSoundPlayer.PlayWarrior(group.UnitType, spMove);
              end;
            end;
  