From c37beb78eeae598db0ae8a2883ac0e3ee3dc0ef5 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 27 Feb 2021 21:31:23 +0000 Subject: [PATCH] Check for broken custom bridge head states, and bump save version --- src/saveload/afterload.cpp | 42 ++++++++++++++++++++++++++++++++ src/saveload/extended_ver_sl.cpp | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 6fe47f8826..660ad144e4 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1542,6 +1542,48 @@ bool AfterLoadGame() } } + if (SlXvIsFeaturePresent(XSLFI_CUSTOM_BRIDGE_HEADS, 1, 3)) { + /* fix any mismatched road/tram bits */ + for (TileIndex t = 0; t < map_size; t++) { + if (IsBridgeTile(t) && GetTunnelBridgeTransportType(t) == TRANSPORT_ROAD) { + for (RoadTramType rtt : { RTT_TRAM, RTT_ROAD }) { + RoadType rt = GetRoadType(t, rtt); + if (rt == INVALID_ROADTYPE) continue; + RoadBits rb = GetCustomBridgeHeadRoadBits(t, rtt); + DiagDirection dir = GetTunnelBridgeDirection(t); + if (!(rb & DiagDirToRoadBits(dir))) continue; + + if (HasAtMostOneBit(rb)) { + DEBUG(misc, 0, "Fixing road bridge head state (case A) at tile 0x%X", t); + rb |= DiagDirToRoadBits(ReverseDiagDir(dir)); + SetCustomBridgeHeadRoadBits(t, rtt, rb); + } + + TileIndex end = GetOtherBridgeEnd(t); + if (GetRoadType(end, rtt) == INVALID_ROADTYPE) { + DEBUG(misc, 0, "Fixing road bridge head state (case B) at tile 0x%X -> 0x%X", t, end); + SetRoadType(end, rtt, rt); + SetCustomBridgeHeadRoadBits(end, rtt, AxisToRoadBits(DiagDirToAxis(dir))); + continue; + } + + if (GetRoadType(end, rtt) != rt) { + DEBUG(misc, 0, "Fixing road bridge head state (case C) at tile 0x%X -> 0x%X", t, end); + SetRoadType(end, rtt, rt); + } + + RoadBits end_rb = GetCustomBridgeHeadRoadBits(end, rtt); + if (!(end_rb & DiagDirToRoadBits(ReverseDiagDir(dir)))) { + DEBUG(misc, 0, "Fixing road bridge head state (case D) at tile 0x%X -> 0x%X", t, end); + end_rb |= DiagDirToRoadBits(ReverseDiagDir(dir)); + if (HasAtMostOneBit(end_rb)) end_rb |= DiagDirToRoadBits(dir); + SetCustomBridgeHeadRoadBits(end, rtt, end_rb); + } + } + } + } + } + /* Elrails got added in rev 24 */ if (IsSavegameVersionBefore(SLV_24)) { RailType min_rail = RAILTYPE_ELECTRIC; diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 9ad1fce10b..177d35b489 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -103,7 +103,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_CARGO_TYPE_ORDERS, XSCF_NULL, 3, 3, "cargo_type_orders", nullptr, nullptr, "ORDX,VEOX" }, { XSLFI_EXTENDED_GAMELOG, XSCF_NULL, 1, 1, "extended_gamelog", nullptr, nullptr, nullptr }, { XSLFI_STATION_CATCHMENT_INC, XSCF_NULL, 1, 1, "station_catchment_inc", nullptr, nullptr, nullptr }, - { XSLFI_CUSTOM_BRIDGE_HEADS, XSCF_NULL, 3, 3, "custom_bridge_heads", nullptr, nullptr, nullptr }, + { XSLFI_CUSTOM_BRIDGE_HEADS, XSCF_NULL, 4, 4, "custom_bridge_heads", nullptr, nullptr, nullptr }, { XSLFI_CHUNNEL, XSCF_NULL, 2, 2, "chunnel", nullptr, nullptr, "TUNN" }, { XSLFI_SCHEDULED_DISPATCH, XSCF_NULL, 2, 2, "scheduled_dispatch", nullptr, nullptr, nullptr }, { XSLFI_MORE_TOWN_GROWTH_RATES, XSCF_NULL, 1, 1, "more_town_growth_rates", nullptr, nullptr, nullptr },