diff --git a/src/economy.cpp b/src/economy.cpp index 4376a92bbd..f61031b315 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -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(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(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(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(1, industry_scale)); } diff --git a/src/economy_type.h b/src/economy_type.h index 4f11f42976..4f1e04a183 100644 --- a/src/economy_type.h +++ b/src/economy_type.h @@ -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; diff --git a/src/lang/extra/english.txt b/src/lang/extra/english.txt index 231da1f33f..734e56ea8e 100644 --- a/src/lang/extra/english.txt +++ b/src/lang/extra/english.txt @@ -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. diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index fdf182f507..20bd183bf1 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -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)) { diff --git a/src/settings.cpp b/src/settings.cpp index dc76c87761..df5af06de8 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -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; } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 523f981a3f..afa5bbd7b7 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -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")); diff --git a/src/settings_type.h b/src/settings_type.h index 0deeeeda13..e2165d42db 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -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 diff --git a/src/table/settings/economy_settings.ini b/src/table/settings/economy_settings.ini index 4d2fa29162..4204687620 100644 --- a/src/table/settings/economy_settings.ini +++ b/src/table/settings/economy_settings.ini @@ -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