Maybe I'm misunderstanding, but why not simply return the max value when the distance falls within the radius, and apply the dropoff to what falls outside? In code:
sub boost {
my ($dist, $imp, $rad, $drop) = @_;
if ($dist <= $rad) {
return $imp;
} else {
return $imp / ($dist - $rad + 1) ** $drop;
}
}
my $imp = 1000;
my $rad = 125;
my $drop = 0.5;
for (map 2**$_, 4..13) {
my $boost = boost($_, $imp, $rad, $drop);
my $bar = "@" x ($boost/($imp*0.02));
printf "%6d %s %.1f\n", $_, $bar, $boost;
}
__END__
16 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1000.0
32 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1000.0
64 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1000.0
128 @@@@@@@@@@@@@@@@@@@@@@@@@@@@ 577.4
256 @@@@ 87.4
512 @@ 50.8
1024 @ 33.4
2048 @ 22.8
4096 15.9
8192 11.1