Might be easier to help if you have a sample database/sample data to share.
For the ranking, you can put each score in its own record and sort them. Then the following unstored calculation can return the rank;
Let ( R = Get ( RecordNumber ) ;
Case ( R = 1 ; 1 ;
GetNthRecord ( R - 1 ; Weight ) = Weight ; GetNthRecord ( R - 1 ; Rank ) ;
Get ( RecordNumber )
) // Case
For all but the "no weight" records, Score is 100 - Rank + 1