Add settings for town/industry cargo production scaling modes

pull/642/head
Jonathan G Rennison 4 months ago
parent 53d29852e4
commit 3ab31f5518

@ -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

Loading…
Cancel
Save