Realmente no ha proporcionado suficiente información para saber qué tipo de rango desea, es decir, si está limitado, si desea progresión geométrica, etc.
Lo primero que debe hacer es obtener un número proporcional a la cantidad de velocidad que desea perder (no tiene que ser igual, pero debe disminuir a medida que aumenta la velocidad para que sea proporcional a su pérdida). La forma estándar de hacerlo es tomar el recíproco :
temp = 1 / currentVelocity;
Ahora, para 100 tendrá 0.01, para 200 tendrá 0.005, para 300 tendrá 0.0033 y así sucesivamente.
Ahora solo necesita ajustar ese número a lo que realmente quiera, multiplicándolo. Entonces
k = 3000;
newVelocity = temp * k;
le dará 20 por 300, pero le dará 15 por 200 en lugar de 10. Esto puede estar bien para usted, en ese caso no necesita leer más. Puede ajustar k como desee, pero es posible que no obtenga los números de la manera que lo desee a menos que haga un poco más, como implementar la progresión geométrica o cambiar la base para aumentar. No voy a entrar en progresiones geométricas aquí, pero si quieres cambiar la base, hazlo de la siguiente manera:
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)
Esto le proporcionará el rango que solicitó originalmente en su pregunta, 300 -> pérdida de 10, 200 -> pérdida de 20. FYI 100 -> pérdida de 40 y 50 -> pérdida de 80 (!) Lo que significa que necesitaría restringir su resta, que es lo que hice en las líneas (1) y (2).
Hay otras formas de abordar este problema, por supuesto, que estoy seguro de que los más expertos matemáticamente que yo publicaremos aquí.
log(myVelocity + 1) * N
?