Add function to turn a percentage into a quantity scaling factor
This commit is contained in:
@@ -2697,6 +2697,32 @@ uint ScaleQuantity(uint amount, int cf, int fine, bool allow_trunc)
|
||||
return amount;
|
||||
}
|
||||
|
||||
int PercentageToScaleQuantityFactor(uint percentage)
|
||||
{
|
||||
const uint32_t adj[11] = {65536, 70239, 75281, 80684, 86475, 92681, 99334, 106463, 114104, 122294, 65536 * 2};
|
||||
|
||||
const uint64_t base = (((uint64_t)1) << 32);
|
||||
uint64_t scale = CeilDivT<uint64_t>(base, 100) * percentage;
|
||||
const uint8_t first_bit = FindLastBit(scale);
|
||||
if (first_bit >= 16) {
|
||||
scale >>= (first_bit - 16);
|
||||
} else {
|
||||
scale <<= (16 - first_bit);
|
||||
}
|
||||
|
||||
uint32_t best_distance = INT32_MAX;
|
||||
int best = 0;
|
||||
for (int i = 0; i < 11; i++) {
|
||||
uint32_t distance = Delta((uint32_t)scale, adj[i]);
|
||||
if (distance < best_distance) {
|
||||
best = i;
|
||||
best_distance = distance;
|
||||
}
|
||||
}
|
||||
|
||||
return ((((int)first_bit) - 32) * 10) + best;
|
||||
}
|
||||
|
||||
uint CargoScaler::ScaleAllowTrunc(uint num)
|
||||
{
|
||||
return this->ScaleWithBias(num, Random() & 0xFFFF);
|
||||
|
Reference in New Issue
Block a user