Add settings for town/industry cargo production scaling modes
This commit is contained in:
@@ -2701,7 +2701,16 @@ uint CargoScaler::ScaleAllowTrunc(uint num)
|
||||
|
||||
void UpdateCargoScalers()
|
||||
{
|
||||
_town_cargo_scaler.SetScale((_settings_game.economy.town_cargo_scale << 16) / 100);
|
||||
_industry_cargo_scaler.SetScale((_settings_game.economy.industry_cargo_scale << 16) / 100);
|
||||
_industry_inverse_cargo_scaler.SetScale((100 << 16) / std::max<uint>(1, _settings_game.economy.industry_cargo_scale));
|
||||
uint town_scale = _settings_game.economy.town_cargo_scale;
|
||||
if (_settings_game.economy.town_cargo_scale_mode == CSM_DAYLENGTH) {
|
||||
town_scale = Clamp<uint>(town_scale * _settings_game.economy.day_length_factor, 1, 5000);
|
||||
}
|
||||
_town_cargo_scaler.SetScale((town_scale << 16) / 100);
|
||||
|
||||
uint industry_scale = _settings_game.economy.industry_cargo_scale;
|
||||
if (_settings_game.economy.industry_cargo_scale_mode == CSM_DAYLENGTH) {
|
||||
industry_scale = Clamp<uint>(industry_scale * _settings_game.economy.day_length_factor, 5, 3000);
|
||||
}
|
||||
_industry_cargo_scaler.SetScale((industry_scale << 16) / 100);
|
||||
_industry_inverse_cargo_scaler.SetScale((100 << 16) / std::max<uint>(1, industry_scale));
|
||||
}
|
||||
|
@@ -253,6 +253,13 @@ enum TickRateMode : byte {
|
||||
TRM_END, ///< Used for iterations and limit testing
|
||||
};
|
||||
|
||||
enum CargoScalingMode : byte {
|
||||
CSM_BEGIN = 0, ///< Used for iterations and limit testing
|
||||
CSM_MONTHLY = 0, ///< Traditional cargo scaling
|
||||
CSM_DAYLENGTH, ///< Also scale by day length
|
||||
CSM_END, ///< Used for iterations and limit testing
|
||||
};
|
||||
|
||||
struct CargoScaler {
|
||||
private:
|
||||
uint32_t scale16 = 1 << 16;
|
||||
|
@@ -566,7 +566,18 @@ STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Scale industry
|
||||
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Scale the cargo production of industries by this percentage.
|
||||
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT_EXTRA :{STRING}{}This excludes tree-cutting industries.{}This is not guaranteed to be fully compatible with all industry NewGRFs.
|
||||
|
||||
STR_CONFIG_SETTING_TOWN_CARGO_SCALE_MODE :Time interval for town cargo production scaling: {STRING2}
|
||||
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_MODE :Time interval for industry cargo production scaling: {STRING2}
|
||||
|
||||
STR_CONFIG_SETTING_CARGO_SCALE_MODE_HELPTEXT :Monthly: The cargo production per month is scaled.{}{}Game-time: The cargo production per unit of game time is scaled, (the cargo production per month is also scaled by the day length factor). Very high scaling factors may not be achievable.
|
||||
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_MODE_HELPTEXT_EXTRA :{STRING}{}Game-time mode is not guaranteed to be fully compatible with all industry NewGRFs.
|
||||
|
||||
STR_CONFIG_SETTING_CARGO_SCALE_MODE_MONTHLY :Monthly
|
||||
STR_CONFIG_SETTING_CARGO_SCALE_MODE_GAME_TIME :Game-time
|
||||
|
||||
STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}%
|
||||
STR_CONFIG_SETTING_CARGO_SCALE_VALUE_MONTHLY :{NUM}% (monthly)
|
||||
STR_CONFIG_SETTING_CARGO_SCALE_VALUE_REAL_TIME :{NUM}% (game-time)
|
||||
|
||||
STR_CONFIG_SETTING_TOWN_ABOVE_HEIGHT :No towns above height level: {STRING2}
|
||||
STR_CONFIG_SETTING_TOWN_ABOVE_HEIGHT_HELPTEXT :No towns above the specified height level are built during map creation.
|
||||
|
@@ -3952,6 +3952,8 @@ bool AfterLoadGame()
|
||||
/* Apply the new-game cargo scale values for scenarios */
|
||||
_settings_game.economy.town_cargo_scale = _settings_newgame.economy.town_cargo_scale;
|
||||
_settings_game.economy.industry_cargo_scale = _settings_newgame.economy.industry_cargo_scale;
|
||||
_settings_game.economy.town_cargo_scale_mode = _settings_newgame.economy.town_cargo_scale_mode;
|
||||
_settings_game.economy.industry_cargo_scale_mode = _settings_newgame.economy.industry_cargo_scale_mode;
|
||||
} else {
|
||||
if (SlXvIsFeatureMissing(XSLFI_TOWN_CARGO_ADJ)) {
|
||||
_settings_game.economy.town_cargo_scale = 100;
|
||||
@@ -3960,12 +3962,18 @@ bool AfterLoadGame()
|
||||
} else if (SlXvIsFeaturePresent(XSLFI_TOWN_CARGO_ADJ, 2, 2)) {
|
||||
_settings_game.economy.town_cargo_scale = ScaleQuantity(100, _settings_game.old_economy.town_cargo_scale_factor);
|
||||
}
|
||||
if (!SlXvIsFeaturePresent(XSLFI_TOWN_CARGO_ADJ, 3)) {
|
||||
_settings_game.economy.town_cargo_scale_mode = CSM_MONTHLY;
|
||||
}
|
||||
|
||||
if (SlXvIsFeatureMissing(XSLFI_INDUSTRY_CARGO_ADJ)) {
|
||||
_settings_game.economy.industry_cargo_scale = 100;
|
||||
} else if (SlXvIsFeaturePresent(XSLFI_INDUSTRY_CARGO_ADJ, 1, 1)) {
|
||||
_settings_game.economy.industry_cargo_scale = ScaleQuantity(100, _settings_game.old_economy.industry_cargo_scale_factor);
|
||||
}
|
||||
if (!SlXvIsFeaturePresent(XSLFI_TOWN_CARGO_ADJ, 2)) {
|
||||
_settings_game.economy.industry_cargo_scale_mode = CSM_MONTHLY;
|
||||
}
|
||||
}
|
||||
|
||||
if (SlXvIsFeatureMissing(XSLFI_SAFER_CROSSINGS)) {
|
||||
|
@@ -2079,6 +2079,18 @@ static bool TrainPathfinderSettingGUI(SettingOnGuiCtrlData &data)
|
||||
}
|
||||
}
|
||||
|
||||
static bool TownCargoScaleGUI(SettingOnGuiCtrlData &data)
|
||||
{
|
||||
switch (data.type) {
|
||||
case SOGCT_VALUE_DPARAMS:
|
||||
SetDParam(data.offset, STR_CONFIG_SETTING_CARGO_SCALE_VALUE_MONTHLY + GetGameSettings().economy.town_cargo_scale_mode);
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool IndustryCargoScaleGUI(SettingOnGuiCtrlData &data)
|
||||
{
|
||||
switch (data.type) {
|
||||
@@ -2087,6 +2099,23 @@ static bool IndustryCargoScaleGUI(SettingOnGuiCtrlData &data)
|
||||
data.text = STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT_EXTRA;
|
||||
return true;
|
||||
|
||||
case SOGCT_VALUE_DPARAMS:
|
||||
SetDParam(data.offset, STR_CONFIG_SETTING_CARGO_SCALE_VALUE_MONTHLY + GetGameSettings().economy.industry_cargo_scale_mode);
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool IndustryCargoScaleModeGUI(SettingOnGuiCtrlData &data)
|
||||
{
|
||||
switch (data.type) {
|
||||
case SOGCT_DESCRIPTION_TEXT:
|
||||
SetDParam(0, data.text);
|
||||
data.text = STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_MODE_HELPTEXT_EXTRA;
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@@ -2466,6 +2466,7 @@ static SettingsContainer &GetSettingsTree()
|
||||
town_zone->Add(new SettingEntry("economy.city_zone_4_mult"));
|
||||
}
|
||||
towns->Add(new SettingEntry("economy.town_cargo_scale"));
|
||||
towns->Add(new SettingEntry("economy.town_cargo_scale_mode"));
|
||||
towns->Add(new SettingEntry("economy.town_growth_rate"));
|
||||
towns->Add(new SettingEntry("economy.town_growth_cargo_transported"));
|
||||
towns->Add(new SettingEntry("economy.town_zone_calc_mode"));
|
||||
@@ -2489,6 +2490,7 @@ static SettingsContainer &GetSettingsTree()
|
||||
SettingsPage *industries = environment->Add(new SettingsPage(STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES));
|
||||
{
|
||||
industries->Add(new SettingEntry("economy.industry_cargo_scale"));
|
||||
industries->Add(new SettingEntry("economy.industry_cargo_scale_mode"));
|
||||
industries->Add(new SettingEntry("difficulty.industry_density"));
|
||||
industries->Add(new SettingEntry("construction.raw_industry_construction"));
|
||||
industries->Add(new SettingEntry("construction.industry_platform"));
|
||||
|
@@ -765,6 +765,8 @@ struct EconomySettings {
|
||||
bool infrastructure_maintenance; ///< enable monthly maintenance fee for owner infrastructure
|
||||
uint16_t town_cargo_scale; ///< scale cargo production of towns by this percentage.
|
||||
uint16_t industry_cargo_scale; ///< scale cargo production of industries by this percentage.
|
||||
CargoScalingMode town_cargo_scale_mode; ///< scaling mode for town cargo.
|
||||
CargoScalingMode industry_cargo_scale_mode; ///< industry mode for town cargo.
|
||||
uint8_t day_length_factor; ///< factor which the length of day is multiplied
|
||||
uint16_t random_road_reconstruction; ///< chance out of 1000 per tile loop for towns to start random road re-construction
|
||||
bool disable_inflation_newgrf_flag; ///< Disable NewGRF inflation flag
|
||||
|
@@ -21,7 +21,9 @@ static void TownZoneModeChanged(int32_t new_value);
|
||||
static void TownZoneCustomValueChanged(int32_t new_value);
|
||||
|
||||
static bool OrderTownGrowthRate(SettingOnGuiCtrlData &data);
|
||||
static bool TownCargoScaleGUI(SettingOnGuiCtrlData &data);
|
||||
static bool IndustryCargoScaleGUI(SettingOnGuiCtrlData &data);
|
||||
static bool IndustryCargoScaleModeGUI(SettingOnGuiCtrlData &data);
|
||||
|
||||
static const SettingTable _economy_settings{
|
||||
[post-amble]
|
||||
@@ -715,6 +717,7 @@ strhelp = STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT
|
||||
strval = STR_CONFIG_SETTING_CARGO_SCALE_VALUE
|
||||
cat = SC_BASIC
|
||||
post_cb = [](auto) { UpdateCargoScalers(); }
|
||||
guiproc = TownCargoScaleGUI
|
||||
|
||||
[SDT_VAR]
|
||||
var = economy.industry_cargo_scale
|
||||
@@ -731,6 +734,35 @@ cat = SC_BASIC
|
||||
post_cb = [](auto) { UpdateCargoScalers(); }
|
||||
guiproc = IndustryCargoScaleGUI
|
||||
|
||||
[SDT_VAR]
|
||||
var = economy.town_cargo_scale_mode
|
||||
type = SLE_UINT8
|
||||
flags = SF_GUI_DROPDOWN | SF_PATCH
|
||||
def = CSM_MONTHLY
|
||||
min = CSM_BEGIN
|
||||
max = CSM_END - 1
|
||||
interval = 1
|
||||
str = STR_CONFIG_SETTING_TOWN_CARGO_SCALE_MODE
|
||||
strhelp = STR_CONFIG_SETTING_CARGO_SCALE_MODE_HELPTEXT
|
||||
strval = STR_CONFIG_SETTING_CARGO_SCALE_MODE_MONTHLY
|
||||
cat = SC_BASIC
|
||||
post_cb = [](auto) { InvalidateWindowClassesData(WC_GAME_OPTIONS); UpdateCargoScalers(); }
|
||||
|
||||
[SDT_VAR]
|
||||
var = economy.industry_cargo_scale_mode
|
||||
type = SLE_UINT8
|
||||
flags = SF_GUI_DROPDOWN | SF_PATCH
|
||||
def = CSM_MONTHLY
|
||||
min = CSM_BEGIN
|
||||
max = CSM_END - 1
|
||||
interval = 1
|
||||
str = STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_MODE
|
||||
strhelp = STR_CONFIG_SETTING_CARGO_SCALE_MODE_HELPTEXT
|
||||
strval = STR_CONFIG_SETTING_CARGO_SCALE_MODE_MONTHLY
|
||||
cat = SC_BASIC
|
||||
post_cb = [](auto) { InvalidateWindowClassesData(WC_GAME_OPTIONS); UpdateCargoScalers(); }
|
||||
guiproc = IndustryCargoScaleModeGUI
|
||||
|
||||
[SDT_VAR]
|
||||
var = economy.random_road_reconstruction
|
||||
type = SLE_UINT16
|
||||
|
Reference in New Issue
Block a user