diff --git a/src/strings.cpp b/src/strings.cpp index 32e34ad5f1..e22af1a979 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -658,8 +658,7 @@ static const char *ParseStringChoice(const char *b, uint form, char **dst, const /** Helper for unit conversion. */ struct UnitConversion { - int multiplier; ///< Amount to multiply upon conversion. - int shift; ///< Amount to shift upon conversion. + double factor; ///< Amount to multiply or divide upon conversion. /** * Convert value from OpenTTD's internal unit into the displayed value. @@ -669,7 +668,9 @@ struct UnitConversion { */ int64 ToDisplay(int64 input, bool round = true) const { - return ((input * this->multiplier) + (round && this->shift != 0 ? 1 << (this->shift - 1) : 0)) >> this->shift; + return round + ? (int64_t)std::round(input * this->factor) + : (int64_t)(input * this->factor); } /** @@ -681,7 +682,9 @@ struct UnitConversion { */ int64 FromDisplay(int64 input, bool round = true, int64 divider = 1) const { - return ((input << this->shift) + (round ? (this->multiplier * divider) - 1 : 0)) / (this->multiplier * divider); + return round + ? (int64_t)std::round(input / this->factor / divider) + : (int64_t)(input / this->factor / divider); } }; @@ -701,59 +704,59 @@ struct UnitsLong { /** Unit conversions for velocity. */ static const Units _units_velocity[] = { - { { 1, 0}, STR_UNITS_VELOCITY_IMPERIAL, 0 }, - { { 103, 6}, STR_UNITS_VELOCITY_METRIC, 0 }, - { { 1831, 12}, STR_UNITS_VELOCITY_SI, 0 }, - { { 37888, 16}, STR_UNITS_VELOCITY_GAMEUNITS, 1 }, - { { 7289499, 23}, STR_UNITS_VELOCITY_KNOTS, 0 }, + { { 1.0 }, STR_UNITS_VELOCITY_IMPERIAL, 0 }, + { { 1.609344 }, STR_UNITS_VELOCITY_METRIC, 0 }, + { { 0.44704 }, STR_UNITS_VELOCITY_SI, 0 }, + { { 0.578125 }, STR_UNITS_VELOCITY_GAMEUNITS, 1 }, + { { 0.868976 }, STR_UNITS_VELOCITY_KNOTS, 0 }, }; /** Unit conversions for power. */ static const Units _units_power[] = { - { { 1, 0}, STR_UNITS_POWER_IMPERIAL, 0 }, - { {4153, 12}, STR_UNITS_POWER_METRIC, 0 }, - { {6109, 13}, STR_UNITS_POWER_SI, 0 }, + { { 1.0 }, STR_UNITS_POWER_IMPERIAL, 0 }, + { { 1.01387 }, STR_UNITS_POWER_METRIC, 0 }, + { { 0.745699 }, STR_UNITS_POWER_SI, 0 }, }; /** Unit conversions for power to weight. */ static const Units _units_power_to_weight[] = { - { { 29, 5}, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL, 1}, - { { 1, 0}, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC, 1}, - { { 1, 0}, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI, 1}, - { { 59, 6}, STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL, 1}, - { { 65, 6}, STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC, 1}, - { { 65, 6}, STR_UNITS_POWER_METRIC_TO_WEIGHT_SI, 1}, - { { 173, 8}, STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL, 1}, - { { 3, 2}, STR_UNITS_POWER_SI_TO_WEIGHT_METRIC, 1}, - { { 3, 2}, STR_UNITS_POWER_SI_TO_WEIGHT_SI, 1}, + { { 0.907185 }, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_IMPERIAL, 1 }, + { { 1.0 }, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_METRIC, 1 }, + { { 1.0 }, STR_UNITS_POWER_IMPERIAL_TO_WEIGHT_SI, 1 }, + { { 0.919768 }, STR_UNITS_POWER_METRIC_TO_WEIGHT_IMPERIAL, 1 }, + { { 1.01387 }, STR_UNITS_POWER_METRIC_TO_WEIGHT_METRIC, 1 }, + { { 1.01387 }, STR_UNITS_POWER_METRIC_TO_WEIGHT_SI, 1 }, + { { 0.676487 }, STR_UNITS_POWER_SI_TO_WEIGHT_IMPERIAL, 1 }, + { { 0.745699 }, STR_UNITS_POWER_SI_TO_WEIGHT_METRIC, 1 }, + { { 0.745699 }, STR_UNITS_POWER_SI_TO_WEIGHT_SI, 1 }, }; /** Unit conversions for weight. */ static const UnitsLong _units_weight[] = { - { {4515, 12}, STR_UNITS_WEIGHT_SHORT_IMPERIAL, STR_UNITS_WEIGHT_LONG_IMPERIAL }, - { { 1, 0}, STR_UNITS_WEIGHT_SHORT_METRIC, STR_UNITS_WEIGHT_LONG_METRIC }, - { {1000, 0}, STR_UNITS_WEIGHT_SHORT_SI, STR_UNITS_WEIGHT_LONG_SI }, + { { 1.102311 }, STR_UNITS_WEIGHT_SHORT_IMPERIAL, STR_UNITS_WEIGHT_LONG_IMPERIAL }, + { { 1.0 }, STR_UNITS_WEIGHT_SHORT_METRIC, STR_UNITS_WEIGHT_LONG_METRIC }, + { { 1000.0 }, STR_UNITS_WEIGHT_SHORT_SI, STR_UNITS_WEIGHT_LONG_SI }, }; /** Unit conversions for volume. */ static const UnitsLong _units_volume[] = { - { {4227, 4}, STR_UNITS_VOLUME_SHORT_IMPERIAL, STR_UNITS_VOLUME_LONG_IMPERIAL }, - { {1000, 0}, STR_UNITS_VOLUME_SHORT_METRIC, STR_UNITS_VOLUME_LONG_METRIC }, - { { 1, 0}, STR_UNITS_VOLUME_SHORT_SI, STR_UNITS_VOLUME_LONG_SI }, + { { 264.172 }, STR_UNITS_VOLUME_SHORT_IMPERIAL, STR_UNITS_VOLUME_LONG_IMPERIAL }, + { { 1000.0 }, STR_UNITS_VOLUME_SHORT_METRIC, STR_UNITS_VOLUME_LONG_METRIC }, + { { 1.0 }, STR_UNITS_VOLUME_SHORT_SI, STR_UNITS_VOLUME_LONG_SI }, }; /** Unit conversions for force. */ static const Units _units_force[] = { - { {3597, 4}, STR_UNITS_FORCE_IMPERIAL, 0 }, - { {3263, 5}, STR_UNITS_FORCE_METRIC, 0 }, - { { 1, 0}, STR_UNITS_FORCE_SI, 0 }, + { { 224.809 }, STR_UNITS_FORCE_IMPERIAL, 0 }, + { { 101.972 }, STR_UNITS_FORCE_METRIC, 0 }, + { { 1.0 }, STR_UNITS_FORCE_SI, 0 }, }; /** Unit conversions for height. */ static const Units _units_height[] = { - { { 3, 0}, STR_UNITS_HEIGHT_IMPERIAL, 0 }, // "Wrong" conversion factor for more nicer GUI values - { { 1, 0}, STR_UNITS_HEIGHT_METRIC, 0 }, - { { 1, 0}, STR_UNITS_HEIGHT_SI, 0 }, + { { 3.0 }, STR_UNITS_HEIGHT_IMPERIAL, 0 }, // "Wrong" conversion factor for more nicer GUI values + { { 1.0 }, STR_UNITS_HEIGHT_METRIC, 0 }, + { { 1.0 }, STR_UNITS_HEIGHT_SI, 0 }, }; /**