diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -59,6 +59,7 @@ #include "saveload_internal.h" +#include "extended_ver_sl.h" #include @@ -750,6 +751,9 @@ bool AfterLoadGame() _settings_game.construction.max_bridge_length = 64; _settings_game.construction.max_tunnel_length = 64; } + if (SlXvIsFeatureMissing(XSLFI_DAYLENGTH)) { + _settings_game.economy.daylength_multiplier = 1; + } if (IsSavegameVersionBefore(SLV_166)) _settings_game.economy.infrastructure_maintenance = false; if (IsSavegameVersionBefore(SLV_183)) { _settings_game.linkgraph.distribution_pax = DT_MANUAL; @@ -757,6 +761,9 @@ bool AfterLoadGame() _settings_game.linkgraph.distribution_armoured = DT_MANUAL; _settings_game.linkgraph.distribution_default = DT_MANUAL; } + if (SlXvIsFeatureMissing(XSLFI_TOWN_IMPROVEMENTS)) { + _settings_game.economy.town_growth_multiplier = _settings_game.economy.daylength_multiplier; + } if (IsSavegameVersionBefore(SLV_ENDING_YEAR)) { _settings_game.game_creation.ending_year = DEF_END_YEAR; @@ -2419,6 +2426,23 @@ bool AfterLoadGame() for (Depot *d : Depot::Iterate()) d->build_date = _date; } + if (!SlXvIsFeaturePresent(XSLFI_EXTRA_EXPENSES, 2, 2)) + { + // expenses size isn't currently 23. fix the array which now contains broken data + + bool first_extension_present = SlXvIsFeaturePresent(XSLFI_EXTRA_EXPENSES, 1, 1); + int old_expenses_size = first_extension_present ? 22 : 13; + int new_expenses_size = 23; + int second_expenses_offset = old_expenses_size - (new_expenses_size - old_expenses_size); + + for (Company* c : Company::Iterate()) { + std::copy_backward(&c->yearly_expenses[1][second_expenses_offset], &c->yearly_expenses[1][second_expenses_offset] + old_expenses_size, &c->yearly_expenses[2][0] + old_expenses_size); + std::copy_backward(&c->yearly_expenses[0][old_expenses_size], &c->yearly_expenses[0][old_expenses_size] + old_expenses_size, &c->yearly_expenses[1][0] + old_expenses_size); + std::fill_n(&c->yearly_expenses[0][old_expenses_size], new_expenses_size - old_expenses_size, 0); + std::fill_n(&c->yearly_expenses[1][old_expenses_size], new_expenses_size - old_expenses_size, 0); + } + } + /* In old versions it was possible to remove an airport while a plane was * taking off or landing. This gives all kind of problems when building * another airport in the same station so we don't allow that anymore. @@ -2822,6 +2846,37 @@ bool AfterLoadGame() * which is done by StartupEngines(). */ if (gcf_res != GLC_ALL_GOOD) StartupEngines(); + /* Set some breakdown-related variables to the correct values. */ + if (SlXvIsFeatureMissing(XSLFI_IMPROVED_BREAKDOWNS)) { + + for (Vehicle *v : Vehicle::Iterate()) { + switch(v->type) { + case VEH_TRAIN: { + if (Train::From(v)->IsFrontEngine()) { + if (v->breakdown_ctr == 1) SetBit(Train::From(v)->flags, VRF_BREAKDOWN_STOPPED); + } else if (Train::From(v)->IsEngine() || Train::From(v)->IsMultiheaded()) { + /** Non-front engines could have a reliability of 0. + * Set it to the reliability of the front engine or the maximum, whichever is lower. */ + const Engine *e = Engine::Get(v->engine_type); + v->reliability_spd_dec = e->reliability_spd_dec; + v->reliability = std::min(v->First()->reliability, e->reliability); + } + } + case VEH_ROAD: + v->breakdown_chance = 128; + break; + case VEH_SHIP: + v->breakdown_chance = 64; + break; + case VEH_AIRCRAFT: + v->breakdown_chance = Clamp(64 + (AircraftVehInfo(v->engine_type)->max_speed >> 3), 0, 255); + v->breakdown_severity = 40; + break; + default: break; + } + } + } + /* The road owner of standard road stops was not properly accounted for. */ if (IsSavegameVersionBefore(SLV_172)) { for (TileIndex t = 0; t < map_size; t++) {