From ddae95addb0b3ef74c028c5a2dbaa025ec06ba0e Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 25 Nov 2016 23:24:41 +0000 Subject: [PATCH] Rescale town cargo adj setting by 10x, for finer adjustment. Use DECIMAL1 instead of an integer. --- src/lang/english.txt | 1 + src/saveload/afterload.cpp | 5 +++++ src/saveload/extended_ver_sl.cpp | 2 +- src/settings_gui.cpp | 2 +- src/settings_type.h | 3 ++- src/table/settings.ini | 22 ++++++++++++++++++---- src/town_cmd.cpp | 13 ++++++++++++- 7 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 347b857b46..f51b41f9dd 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1666,6 +1666,7 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Forbidden STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Allowed STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Allowed, custom town layout STR_CONFIG_SETTING_TOWN_CARGO_FACTOR :Town cargo generation factor (less < 0 < more): {STRING2} +STR_CONFIG_SETTING_TOWN_CARGO_FACTOR_HELPTEXT :Passenger, mail, and other town cargo production is scaled by approximately 2^factor (exponential) STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :In game placement of trees: {STRING2} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Control random appearance of trees during the game. This might affect industries which rely on tree growth, for example lumber mills diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 7b8071cb57..a9313d79b6 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3307,6 +3307,11 @@ bool AfterLoadGame() FOR_ALL_VEHICLES(v) SB(v->vehicle_flags, VF_TIMETABLE_SEPARATION, 1, _settings_game.order.old_timetable_separation); } + /* Set lifetime vehicle profit to 0 if lifetime profit feature is missing */ + if (!SlXvIsFeaturePresent(XSLFI_TOWN_CARGO_ADJ, 2)) { + _settings_game.economy.town_cargo_scale_factor = _settings_game.economy.old_town_cargo_factor * 10; + } + /* Road stops is 'only' updating some caches */ AfterLoadRoadStops(); AfterLoadLabelMaps(); diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 7685eb10e6..312b4169d1 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -53,7 +53,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_ADJACENT_CROSSINGS, XSCF_NULL, 1, 1, "adjacent_crossings", NULL, NULL, NULL }, { XSLFI_DEPARTURE_BOARDS, XSCF_IGNORABLE_UNKNOWN, 1, 1, "departure_boards", NULL, NULL, NULL }, { XSLFI_TIMETABLES_START_TICKS, XSCF_NULL, 2, 2, "timetable_start_ticks", NULL, NULL, NULL }, - { XSLFI_TOWN_CARGO_ADJ, XSCF_IGNORABLE_UNKNOWN, 1, 1, "town_cargo_adj", NULL, NULL, NULL }, + { XSLFI_TOWN_CARGO_ADJ, XSCF_IGNORABLE_UNKNOWN, 2, 2, "town_cargo_adj", NULL, NULL, NULL }, { XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 4, 4, "signal_tunnel_bridge", NULL, NULL, "XBSS" }, { XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 4, 4, "improved_breakdowns", NULL, NULL, NULL }, { XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 1, 1, "tt_wait_in_depot", NULL, NULL, NULL }, diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 03b2c4c734..ea174a63b8 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1765,7 +1765,7 @@ static SettingsContainer &GetSettingsTree() towns->Add(new SettingEntry("economy.allow_town_roads")); towns->Add(new SettingEntry("economy.allow_town_level_crossings")); towns->Add(new SettingEntry("economy.found_town")); - towns->Add(new SettingEntry("economy.town_cargo_factor")); + towns->Add(new SettingEntry("economy.town_cargo_scale_factor")); towns->Add(new SettingEntry("economy.random_road_reconstruction")); } diff --git a/src/settings_type.h b/src/settings_type.h index 97c2256a4b..3529fa16ce 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -544,7 +544,8 @@ struct EconomySettings { uint sharing_fee[4]; ///< fees for infrastructure sharing for rail/road/water/air bool sharing_payment_in_debt; ///< allow fee payment for companies with more loan than money (switch off to prevent MP exploits) bool allow_town_level_crossings; ///< towns are allowed to build level crossings - int8 town_cargo_factor; ///< power-of-two multiplier for town (passenger, mail) generation. May be negative. + int8 old_town_cargo_factor; ///< old power-of-two multiplier for town (passenger, mail) generation. May be negative. + int16 town_cargo_scale_factor; ///< scaled power-of-two multiplier for town (passenger, mail) generation. May be negative. bool infrastructure_maintenance; ///< enable monthly maintenance fee for owner infrastructure uint8 day_length_factor; ///< factor which the length of day is multiplied uint16 random_road_reconstruction; ///< chance out of 1000 per tile loop for towns to start random road re-construction diff --git a/src/table/settings.ini b/src/table/settings.ini index 71807996a1..c532e843f4 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -677,7 +677,7 @@ str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT [SDT_XREF] -xref = ""economy.town_cargo_factor"" +xref = ""economy.old_town_cargo_factor"" extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) [SDT_VAR] @@ -852,17 +852,31 @@ strhelp = STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT [SDT_VAR] base = GameSettings -var = economy.town_cargo_factor +var = economy.old_town_cargo_factor type = SLE_INT8 -from = 160 def = 0 min = -16 max = +8 interval = 1 str = STR_CONFIG_SETTING_TOWN_CARGO_FACTOR -strval = STR_JUST_INT +strval = STR_JUST_INT +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_TOWN_CARGO_ADJ, 1, 1) patxname = ""town_cargo_adj.economy.town_cargo_factor"" +[SDT_VAR] +base = GameSettings +var = economy.town_cargo_scale_factor +type = SLE_INT16 +guiflags = SGF_DECIMAL1 +def = 0 +min = -160 +max = +80 +interval = 1 +str = STR_CONFIG_SETTING_TOWN_CARGO_FACTOR +strval = STR_JUST_DECIMAL1 +strhelp = STR_CONFIG_SETTING_TOWN_CARGO_FACTOR_HELPTEXT +patxname = ""town_cargo_adj.economy.town_cargo_scale_factor"" + ; Vehicles [SDT_VAR] diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 683f59efdd..cea6536b32 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -574,13 +574,24 @@ static void MakeTownHouseBigger(TileIndex tile) static void TownGenerateCargo (Town *t, CargoID ct, uint amount, StationFinder &stations, bool economy_adjust) { // custom cargo generation factor - int cf = _settings_game.economy.town_cargo_factor; + int factor = _settings_game.economy.town_cargo_scale_factor; // when the economy flunctuates, everyone wants to stay at home if (economy_adjust && EconomyIsInRecession()) { amount = (amount + 1) >> 1; } + factor += 200; // ensure factor is positive + assert(factor >= 0); + int cf = (factor / 10) - 20; + int fine = factor % 10; + if (fine != 0) { + // 2^0.1 << 16 to 2^0.9 << 16 + const uint32 adj[9] = {70239, 75281, 80684, 86475, 92681, 99334, 106463, 114104, 122294}; + uint64 scaled_amount = ((uint64) amount) * ((uint64) adj[fine - 1]); + amount = scaled_amount >> 16; + } + // apply custom factor? if (cf < 0) { // approx (amount / 2^cf)