From 60d5bbc0e7767e48ea7fd73d6fa0db642700eb31 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 5 Jun 2016 22:28:17 +0100 Subject: [PATCH 1/2] Fix improved breakdowns aircraft speed-reductions. Breakdown speed was wrong and possibly 0 for planes with GRF-defined speed limits. --- src/vehicle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 854ccd6458..353f7c45a1 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1205,8 +1205,8 @@ void DetermineBreakdownType(Vehicle *v, uint32 r) { if (rand <= breakdown_type_chance[BREAKDOWN_AIRCRAFT_SPEED]) { v->breakdown_type = BREAKDOWN_AIRCRAFT_SPEED; /* all speed values here are 1/8th of the real max speed in km/h */ - byte max_speed = min(AircraftVehInfo( v->engine_type )->max_speed >> 3, 255); - byte min_speed = min(15 + (max_speed >> 2), AircraftVehInfo(v->engine_type)->max_speed >> 4); + byte max_speed = max(1, min(v->vcache.cached_max_speed >> 3, 255)); + byte min_speed = max(1, min(15 + (max_speed >> 2), v->vcache.cached_max_speed >> 4)); v->breakdown_severity = min_speed + (((v->reliability + GB(r, 16, 16)) * (max_speed - min_speed)) >> 17); } else if (rand <= breakdown_type_chance[BREAKDOWN_AIRCRAFT_DEPOT]) { v->breakdown_type = BREAKDOWN_AIRCRAFT_DEPOT; From 0d20a54606d9d3ba4e2aa0a26293ef3abe81f068 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 5 Jun 2016 23:20:25 +0100 Subject: [PATCH 2/2] Fix broken-down aircraft stuck at 0 speed on load. Bump improved breakdowns version. --- src/saveload/afterload.cpp | 15 +++++++++++++++ src/saveload/extended_ver_sl.cpp | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 8d6009830a..0bee7f36a9 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -2856,6 +2856,21 @@ bool AfterLoadGame() } } } + if (!SlXvIsFeaturePresent(XSLFI_IMPROVED_BREAKDOWNS, 4)) { + Vehicle *v; + FOR_ALL_VEHICLES(v) { + switch(v->type) { + case VEH_AIRCRAFT: + if (v->breakdown_type == BREAKDOWN_AIRCRAFT_SPEED && v->breakdown_severity == 0) { + v->breakdown_severity = max(1, min(v->vcache.cached_max_speed >> 4, 255)); + } + break; + + default: + break; + } + } + } /* The road owner of standard road stops was not properly accounted for. */ if (IsSavegameVersionBefore(172)) { diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index ad4a0b66a0..1233784d8c 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -45,7 +45,7 @@ std::vector _sl_xv_discardable_chunk_ids; ///< list of chunks static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { - { XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 3, 3, "improved_breakdowns", NULL, NULL, NULL }, + { XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 4, 4, "improved_breakdowns", NULL, NULL, NULL }, { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker };