Hi Willy!
I'm a lazy math major at Skyline College in San Bruno (CA Bay Area). I'm actually not that smart, but I have an idea that you may be able to make "smarter" if you get the gist of what I'm suggesting.
For the World Cup rankings, you don't seen to have a sufficiently sophisticated algorithm for determining who, exactly, is ACTUALLY participating in a given project. A lot of people may sign up, and even participate a bit -- but later, they largely ignore the project. Now, let's consider a user that we want to assign World Cup points to: Since that user's PERCENT CONTRIBUTION to a specific project is multiplied by the NUMBER of total users PARTICIPATING in that project, it is absolutely critical to accurately model the functional number of participants.
To do this, you must temporarily abandon binary logic and use what I call a "fuzzy Boolean" value. This is a number that ranges continuously from 0 to 1 (it is never less than 0; never more than one.) This means that "0" would mean "not participating", while 0.1 would mean "not really helping", 0.3 would mean "well.. kinda", 0.5 would mean "halfheartedly participating", 0.7 would mean "phoning it in", etc. Since this "fuzzy Boolean" value is the independent variable, we need a a function of that variable and a dependent variable.
Let's call the independent variable Cprac (for "Credit" sub "project recent average credit"

...a sloppy name, but it represents an individual's RAC for a particular project.
Now we need a function of the variable Cprac that will output values from 0 to 1... but before we do, let's decide what value of Cprac will be the minimum value to give an output of 1 for f(Cprac) [i.e. when the "y" value will equal 1 in the graph of y=f(Cprac)] I will choose a RAC of 10 just because it sounds pretty good (if you have an RAC of 10 for a particular project, I'd say you qualify as an active participant.) So, any value of Cprac that is greater than 10 will also output a value of 1 for f(Cprac).
Now let's give a name to the dependent variable, so we can stop calling it f(Cprac) ...function notation just confuses me anyway. We will call it Mfb (for "Members" sub "fuzzy Boolean"

--this is not a very good name, but oh well. It will represent the "degree" to which a participant is "really" a true active member of the project.
I suggest the following system of two functions (which is a simple exponential function [similar to Moor's Law] with a "model breakdown limiter" added)
(
( Mfb = [2 ^ (Cprac)] / 1024 . . . . . . . . . . . Range: { Cprac | Cprac >= 0 and Cprac <= 10 }
(
( Mfb = 1 . . . . . . . . . . . . . . . . . . . . . . . Range: { Cprac | Cprac > 10 }
(
Please note that when you translate the first function into programming code, you will probably need to adjust it to return a value of zero when Cprac = 0 ...you can use this: Mfb = {[2 ^ (Cprac)] - 1} / 1023 ...but it will probably need a little more tinkering.
So, you can see that when Cprac = 10 in the first function, the output value (Mfb) is 1. The "tack on" function limits this output to 1 regardless of how high Cprac gets.
Finally, all you have to do is sum all the Mfb values for the participants of a project and use that result in place of the "number of participants" variable you have been using.
Obviously, I'm not a jeenyus yet (probably never will be!) and I apologize for for the sloppiness and informal notation.... I'm still a beginner

-- I Hope this was helpful!!
Sincerely,
Daxa