It's super effective!
Java, 663 639 582 bytes

String f(String...a){float d=1;for(String B:a[1].split(&quot;/&quot;))d*=(&quot;222221201222222222421124104222214241242221421224122222222111210224222224220424124421422222214212421422224222211122211124242241022222242222242212222224221112124224222221424114224122222244222411222122221144121141222122224202222241122122242422221222212202224242221114221422222222221222222420212222242222242211242122221122222442&quot;.charAt(g(a[0])*18+g(B))-48)*.5;return(d+&quot;x&quot;).replace(&quot;.0&quot;,&quot;&quot;);}int g(String a){int i=0;for(;i&lt;18;i++)if(a.contains(&quot;N,gh,ly,oi,ou,ck,B,ho,S,re,W,G,E,P,I,g,k,y&quot;.split(&quot;,&quot;)[i]))break;return i;}

There's a simple lookup table that takes much of the room. It just finds the correct types and multiplies it out. Call it like this:
f(&quot;Water&quot;,&quot;Ground/Fire&quot;)

With some line breaks it looks like this:
String f(String...a){
    float d=1;
    for(String B:a[1].split(&quot;/&quot;))
        d*=(&quot;222221201222222222421124104222214241242221421224122222222111210224222224220424124421422222214212421422224222211122211124242241022222242222242212222224221112124224222221424114224122222244222411222122221144121141222122224202222241122122242422221222212202224242221114221422222222221222222420212222242222242211242122221122222442&quot;
                .charAt(g(a[0])*18+g(B))-48)*.5;
    return(d+&quot;x&quot;).replace(&quot;.0&quot;,&quot;&quot;);
}

int g(String a){
    int i=0;
    for(;i&lt;18;i++)
        if(a.contains(&quot;N,gh,ly,oi,ou,ck,B,ho,S,re,W,G,E,P,I,g,k,y&quot;.split(&quot;,&quot;)[i]))
            break;
    return i;
}