#Python 3, 382 bytes

<!-- language: lang-py -->

    T=range(20)
    N=lambda r,c:{(a,b)for a,b in{(r+x//3-1,c+x%3-1+(x//3!=1)*r%2)for x in[0,1,3,5,6,7]}if-1<b<20>a>-1}
    def S(B):
     def F(i,r,c):j=J[r][c]!=i;J[r][c]*=j;j or[F(i,*x)for x in N(r,c)];return j
     J=[x[:]for x in B];X=lambda r,c,x,y:x+y in{B[r][c]+B[a][b]for a,b in N(r,c)};return[sum((i in B[r])+20*(3*X(r,c,"C",i)-~X(r,c,i,"W")-F(i,r,c))for r in T for c in T)//20for i in"1234"]

Quite a mess, but there's still more to be golfed. Explanation coming in a few hours.

The program uses scores 1, 3, 7. Input is a list of lists of chars representing each cell. To test the example board easily, we can do:

<!-- language: lang-py -->

    board = """
    3 3 W . . . 4 . 4 . . 2 W . 4 . . 4 . 4
     3 M W W . 1 1 . . 4 2 W . 3 C 4 4 . . 4
    3 M 2 2 W 1 1 1 T 3 2 W 4 3 . 1 4 . 4 .
     M M . W 2 2 . . . 2 2 W 3 . 1 1 1 . . .
    . 4 M . W W 2 2 2 2 W W 3 . 1 4 . T . .
     . . . . . W W W W W . 3 C 1 . . 2 2 2 2
    . T 1 1 1 1 . . 2 . . 4 . . . 2 2 M M M
     4 . W 4 . C 4 4 . . . . . . 2 M M M M M
    . 4 W W . . . 4 M . . W . W . 2 2 2 M M
     . . . . . . . M M . . W W . . . . 2 M .
    . . . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 . 1
     M 3 3 . . . . . . . . 4 . T 2 . 2 4 1 .
    M M . C . 4 . 4 . . . . . 1 2 4 2 1 1 .
     M . . 1 . 4 . . . . M M 1 2 . . 2 1 . .
    . . . W 1 1 4 1 1 . . . 1 2 . . 2 W W W
     . . 1 1 W 1 T . 1 1 1 1 T . . 2 W . 4 .
    . 1 1 W . 3 3 . . . . . . . . 2 W 4 C 3
     C 1 3 3 3 . 3 . 4 . 4 . 4 . . 2 W 1 1 M
    4 3 3 4 . M 4 3 . . . . . . . 2 W . . .
     . . . 4 . M M 3 . . 4 4 . 4 . 2 W W . .
    """
    
    board = [row.split() for row in board.strip().split("\n")]
    print(S(board))

    # [52, 46, 43, 62]