Check for broken custom bridge head states, and bump save version
This commit is contained in:
@@ -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 */
|
/* Elrails got added in rev 24 */
|
||||||
if (IsSavegameVersionBefore(SLV_24)) {
|
if (IsSavegameVersionBefore(SLV_24)) {
|
||||||
RailType min_rail = RAILTYPE_ELECTRIC;
|
RailType min_rail = RAILTYPE_ELECTRIC;
|
||||||
|
@@ -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_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_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_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_CHUNNEL, XSCF_NULL, 2, 2, "chunnel", nullptr, nullptr, "TUNN" },
|
||||||
{ XSLFI_SCHEDULED_DISPATCH, XSCF_NULL, 2, 2, "scheduled_dispatch", nullptr, nullptr, nullptr },
|
{ 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 },
|
{ XSLFI_MORE_TOWN_GROWTH_RATES, XSCF_NULL, 1, 1, "more_town_growth_rates", nullptr, nullptr, nullptr },
|
||||||
|
Reference in New Issue
Block a user