Você realmente não forneceu informações suficientes para dizer que tipo de intervalo deseja, ou seja, se está limitado, se deseja progressão geométrica etc.
A primeira coisa que você deseja fazer é derivar um número proporcional à quantidade de velocidade que você deseja perder (não precisa ser o mesmo, mas deve diminuir à medida que a velocidade aumenta para torná-lo proporcional à sua perda). A maneira padrão de fazer isso é tomar o inverso :
temp = 1 / currentVelocity;
Agora, para 100 você terá 0,01, para 200 terá 0,005, para 300 terá 0,0033 e assim por diante.
Agora você só precisa ajustar esse número para o que realmente deseja, multiplicando-o. assim
k = 3000;
newVelocity = temp * k;
você receberá 20 por 300, mas 15 por 200 em vez de 10. Isso pode ser bom para você; nesse caso, você não precisa ler mais. Você pode ajustar k como quiser, mas pode não obter os números da maneira que preferir, a menos que faça um pouco mais, como implementar a progressão geométrica ou alterar a base para aumentar. Não vou entrar em progressões geométricas aqui, mas se você quiser alterar a base, faça o seguinte:
base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!
k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
velocityLoss = currentVelocity; //(2)
Isso fornecerá o intervalo solicitado originalmente na sua pergunta: 300 -> perda de 10, 200 -> perda de 20. FYI 100 -> perda de 40 e 50 -> perda de 80 (!), O que significa que você precisaria restringir sua subtração - o que fiz nas linhas (1) e (2).
Existem outras maneiras de abordar todo esse problema, é claro, que tenho certeza de que aqueles que são matematicamente mais adeptos do que eu, postarão aqui.
log(myVelocity + 1) * N
?