I did some work on this a few months ago, actually mostly to do with beams, but the concept could probably be migrated without too much trouble.
With beams this was once upon a time implemented as +Attenuation. Time was irrelevant since beams get there instantly, so distance was the factor. Apparently Attenuation no longer works in the code, but I'm working on fixing and expanding it. So! This is how it would work. Let's call the Attenuation value in the table N for short.
If N is 0, the beam behaves as it does now... no change in damage at all.
If N is 1, the beam starts out at full damage, and ramps down until at maximum range it is zero damage.
If N is between 0 and 1, the beam starts out at full damage, and then at N*range it begins ramping down until at maximum range it is zero damage.
With me so far? Now let's add a crazy additional twist!
If N is -1, the beam starts out at ZERO damage, and ramps up until at maximum range it is at maximum damage.
If N is between -1 and 0, the beam starts out at zero damage, and ramps up until at N*range it hits maximum damage, and remains maximum damage until maximum range.
Does that make sense? Would you like me to post the graphs I made?
I've got this nearly finished for beams, just need more testing to make sure I did the maths right. After that it is only a matter of applying the changes to non-beam weapons (and adding the setting since before only beams had +Attenuation)... give me a week or two.