diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 39f759a877..ed5c5f8796 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1451,6 +1451,44 @@ bool AfterLoadGame() SB(_me[t].m7, 6, 2, 0); // Clear pre-NRT road type bits. } } + } else if (SlXvIsFeaturePresent(XSLFI_JOKERPP, SL_JOKER_1_27)) { + uint next_road_type = 0; + uint next_tram_type = 0; + RoadType road_types[32]; + RoadType tram_types[32]; + MemSetT(road_types, ROADTYPE_ROAD, 31); + MemSetT(tram_types, ROADTYPE_TRAM, 31); + road_types[31] = INVALID_ROADTYPE; + tram_types[31] = INVALID_ROADTYPE; + for (RoadType rt = ROADTYPE_BEGIN; rt < ROADTYPE_END; rt++) { + if (RoadTypeIsRoad(rt)) { + if (next_road_type < 31) road_types[next_road_type++] = rt; + } else { + if (next_tram_type < 31) tram_types[next_tram_type++] = rt; + } + } + for (TileIndex t = 0; t < map_size; t++) { + bool has_road = false; + switch (GetTileType(t)) { + case MP_ROAD: + has_road = true; + break; + case MP_STATION: + has_road = IsRoadStop(t); + break; + case MP_TUNNELBRIDGE: + has_road = GetTunnelBridgeTransportType(t) == TRANSPORT_ROAD; + break; + default: + break; + } + if (has_road) { + RoadType road_rt = road_types[(GB(_me[t].m7, 6, 1) << 4) | GB(_m[t].m4, 0, 4)]; + RoadType tram_rt = tram_types[(GB(_me[t].m7, 7, 1) << 4) | GB(_m[t].m4, 4, 4)]; + SetRoadTypes(t, road_rt, tram_rt); + SB(_me[t].m7, 6, 2, 0); + } + } } if (SlXvIsFeatureMissing(XSLFI_DUAL_RAIL_TYPES)) {