Scoring Chinese Hearts
JavaScript (ES6), 160 156 146 143 135 bytes
Saved 10 bytes thanks to @tsh
Takes input as an array of characters.

a=&gt;(a.map(c=&gt;(i='GPDTJQKA'.search(c))&gt;2|c?t-=h--*c?c&gt;4:i-2:m|=1&lt;&lt;i,m=t=0,h=13),t+=!h*40+(m&amp;2)*(m&amp;!h?5:-5)+m%2*10,t+=m&amp;4?t|m&amp;3?t:5:0)*10

Try it online!
Commented
a =&gt; (                     // a[] = input array
  a.map(c =&gt;               // for each card c in a[]:
    (i =                   //   convert c into an index i (-1 to 7)
      'GPDTJQKA'.search(c) //   in the string 'GPDTJQKA'
    ) &gt; 2                  //   if c is a heart symbol (TJQKA)
    | c ?                  //   or c is numeric (2-9):
      t -=                 //     update t (total number of points / 10):
        h--                //       decrement h (number of hearts)
        * c ?              //       if c is numeric:
          c &gt; 4            //         decrement t if c is greater than 4
        :                  //       else:
          i - 2            //         subtract 1 (for Ten) to 5 (for Ace) from t
    :                      //   else:
      m |= 1 &lt;&lt; i,         //     update the bitmask m of special cards (G=1, P=2, D=4)
    m = t = 0, h = 13      //   start with m = 0, t = 0 and h = 13
  ),                       // end of map()
  t +=                     // update t (pass #1):
    !h * 40 +              //   add 40 to t if we have all hearts (-(-200) + 200)
    (m &amp; 2) * (            //   if we have the Pig:
      m &amp; !h ?             //     if we have all hearts and the Goat:
        5                  //       add 10 to t (the Pig is worth +100)
      :                    //     else:
        -5                 //       subtract 10 from t (the Pig is worth -100)
    ) +                    //
    m % 2 * 10,            //   add 10 to t if we have the Goat (the Goat is worth +100)
  t +=                     // update t (pass #2):
    m &amp; 4 ?                //   if we have the Double:
      t | m &amp; 3 ?          //     if t is non-zero or we have either the Pig or the Goat:
        t                  //       double t by adding it to itself
      :                    //     else:
        5                  //       add 5 to t (the Double alone is worth +50)
    :                      //   else:
      0                    //     leave t unchanged
) * 10                     // multiply the final result by 10