Here we go!
The shader has two #defines you can comment out if you dont need them.
The one adds an color intensity shift for shadowed parts and with the other one you can activates a mask (entity skin 2) which defines where the shift shall be stronger/weaker.
The following pic demonstrates the effect:

Up/Left: no color intensity shift
Up/Right: shift without masking
Bottom/Left: the mask
Bottom/Right: intensity shift only for skin using the mask
Middle: light gradiant texture (material skin 1)

These are the user defineable vars:
Code:
//==========================================//
#define USE_COLOR_INTENSITY_SHIFT
#define USE_COLOR_INTENSITY_MASK

float max_colorintensity=4;

float max_sunintensity=1.1;
float min_sunintensity=0.1;
//==========================================//


Variable max_colorintensity determines the strength of the intensity shift if you make use of it.
The other two are quite self-explanatory.
Best is you design the light gradiant texture always so that it starts with total black and ends in total white, then use the two variables to declare the actual min/max values of the sun light strength.
To prevent overhead create multible fx. files and materials if you want some models to use the color intensity shift and others not.

The example is Lite-C but it shouldnt be a problem to use it with C-Skript.
Have fun.

Click to reveal..
shader file content only, for demo follow the download link at the beginning of the post.
Code:
//==========================================//
//#define USE_COLOR_INTENSITY_SHIFT
//#define USE_COLOR_INTENSITY_MASK

float max_colorintensity=4;

float max_sunintensity=1.1;
float min_sunintensity=0.1;
//==========================================//

bool AUTORELOAD;

float4x4 matWorldViewProj;
float4x4 matWorld;

float4 vecSunDir;		
float4 vecSunColor;		

texture entSkin1;

texture mtlSkin1;

sampler COLOR_SAMPLER = sampler_state { Texture   = <entSkin1>; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear;    AddressU  = clamp; AddressV  = clamp; };
sampler LGRAD_SAMPLER = sampler_state { Texture   = <mtlSkin1>; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear;    AddressU  = clamp; AddressV  = clamp; };

#ifdef USE_COLOR_INTENSITY_SHIFT
	#ifdef USE_COLOR_INTENSITY_MASK
		texture entSkin2;
		sampler MASK_SAMPLER = sampler_state { Texture   = <entSkin2>; MinFilter = Linear; MagFilter = Linear; MipFilter = Linear;    AddressU  = clamp; AddressV  = clamp; };
	#endif
#endif


void VS(		
in float4 vPos		   : POSITION,
in float3 normal	   : NORMAL,
in float2 InTex	   : TEXCOORD0,

out float2 OutTex	      : TEXCOORD0,			
out float3 outnormal    : TEXCOORD1,

out float4 Pos	         : POSITION
)
{
	outnormal=mul(normal,matWorld);
	
	Pos = mul(vPos,matWorldViewProj);
	
	OutTex = InTex;
}


void PS(	
in float2 Tex	      : TEXCOORD0,			
in float3 normal     : TEXCOORD1,

out float4 COL :COLOR0
) 
{
	normal      = normalize(normal);

	COL = tex2D(COLOR_SAMPLER,Tex);

	float sun_blub=dot(vecSunDir,normal)*0.5f+0.5f;

	float sun_diff=tex1D(LGRAD_SAMPLER,sun_blub);
	sun_diff=lerp(min_sunintensity,max_sunintensity,sun_diff);

	#ifdef USE_COLOR_INTENSITY_SHIFT

		#ifdef USE_COLOR_INTENSITY_MASK
			COL.rgb=lerp(COL.rgb,pow(COL.rgb,lerp(max_colorintensity,1,min(1,sun_diff))),tex2D(MASK_SAMPLER,Tex));
			#else
			COL.rgb=pow(COL.rgb,lerp(max_colorintensity,1,min(1,sun_diff)));
		#endif

	#endif
	
	COL.rgb=COL.rgb*sun_diff;//*vecSunColor;
//	COL.rgb=tex2D(MASK_SAMPLER,Tex);
}

technique Shading
{
	pass P0
	{	
		zenable=true;
		zwriteenable=true;
		alphablendenable=false;
		alphatestenable=true;
		
		AlphaRef=0;
		AlphaFunc=Greater;
		
		VertexShader = compile vs_2_0 VS();
		PixelShader  = compile ps_2_0 PS();
	}
}