summaryrefslogtreecommitdiff
path: root/src/saveload/afterload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/saveload/afterload.cpp')
-rw-r--r--src/saveload/afterload.cpp91
1 files changed, 69 insertions, 22 deletions
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index 6b273e026..662f5a77b 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -282,6 +282,12 @@ static void InitializeWindowsAndCaches()
(*it)->tile = t->xy;
}
}
+ RoadVehicle *rv;
+ FOR_ALL_ROADVEHICLES(rv) {
+ if (rv->IsFrontEngine()) {
+ rv->CargoChanged();
+ }
+ }
RecomputePrices();
@@ -461,8 +467,19 @@ static void FixOwnerOfRailTrack(TileIndex t)
if (IsLevelCrossingTile(t)) {
/* else change the crossing to normal road (road vehicles won't care) */
- MakeRoadNormal(t, GetCrossingRoadBits(t), GetRoadTypes(t), GetTownIndex(t),
- GetRoadOwner(t, ROADTYPE_ROAD), GetRoadOwner(t, ROADTYPE_TRAM));
+ Owner road = GetRoadOwner(t, RTT_ROAD);
+ Owner tram = GetRoadOwner(t, RTT_TRAM);
+ RoadBits bits = GetCrossingRoadBits(t);
+ bool hasroad = HasBit(_me[t].m7, 6);
+ bool hastram = HasBit(_me[t].m7, 7);
+
+ /* MakeRoadNormal */
+ SetTileType(t, MP_ROAD);
+ SetTileOwner(t, road);
+ _m[t].m3 = (hasroad ? bits : 0);
+ _m[t].m5 = (hastram ? bits : 0) | ROAD_TILE_NORMAL << 6;
+ SB(_me[t].m6, 2, 4, 0);
+ SetRoadOwner(t, RTT_TRAM, tram);
return;
}
@@ -1052,18 +1069,18 @@ bool AfterLoadGame()
break;
case ROAD_TILE_DEPOT: break;
}
- SetRoadTypes(t, ROADTYPES_ROAD);
+ SB(_me[t].m7, 6, 2, 1); // Set pre-NRT road type bits for conversion later.
break;
case MP_STATION:
- if (IsRoadStop(t)) SetRoadTypes(t, ROADTYPES_ROAD);
+ if (IsRoadStop(t)) SB(_me[t].m7, 6, 2, 1);
break;
case MP_TUNNELBRIDGE:
/* Middle part of "old" bridges */
if (old_bridge && IsBridge(t) && HasBit(_m[t].m5, 6)) break;
if (((old_bridge && IsBridge(t)) ? (TransportType)GB(_m[t].m5, 1, 2) : GetTunnelBridgeTransportType(t)) == TRANSPORT_ROAD) {
- SetRoadTypes(t, ROADTYPES_ROAD);
+ SB(_me[t].m7, 6, 2, 1); // Set pre-NRT road type bits for conversion later.
}
break;
@@ -1079,7 +1096,7 @@ bool AfterLoadGame()
for (TileIndex t = 0; t < map_size; t++) {
switch (GetTileType(t)) {
case MP_ROAD:
- if (fix_roadtypes) SetRoadTypes(t, (RoadTypes)GB(_me[t].m7, 5, 3));
+ if (fix_roadtypes) SB(_me[t].m7, 6, 2, (RoadTypes)GB(_me[t].m7, 5, 3));
SB(_me[t].m7, 5, 1, GB(_m[t].m3, 7, 1)); // snow/desert
switch (GetRoadTileType(t)) {
default: SlErrorCorrupt("Invalid road tile type");
@@ -1112,7 +1129,7 @@ bool AfterLoadGame()
case MP_STATION:
if (!IsRoadStop(t)) break;
- if (fix_roadtypes) SetRoadTypes(t, (RoadTypes)GB(_m[t].m3, 0, 3));
+ if (fix_roadtypes) SB(_me[t].m7, 6, 2, (RoadTypes)GB(_m[t].m3, 0, 3));
SB(_me[t].m7, 0, 5, HasBit(_me[t].m6, 2) ? OWNER_TOWN : GetTileOwner(t));
SB(_m[t].m3, 4, 4, _m[t].m1);
_m[t].m4 = 0;
@@ -1121,7 +1138,7 @@ bool AfterLoadGame()
case MP_TUNNELBRIDGE:
if (old_bridge && IsBridge(t) && HasBit(_m[t].m5, 6)) break;
if (((old_bridge && IsBridge(t)) ? (TransportType)GB(_m[t].m5, 1, 2) : GetTunnelBridgeTransportType(t)) == TRANSPORT_ROAD) {
- if (fix_roadtypes) SetRoadTypes(t, (RoadTypes)GB(_m[t].m3, 0, 3));
+ if (fix_roadtypes) SB(_me[t].m7, 6, 2, (RoadTypes)GB(_m[t].m3, 0, 3));
Owner o = GetTileOwner(t);
SB(_me[t].m7, 0, 5, o); // road owner
@@ -1191,13 +1208,14 @@ bool AfterLoadGame()
} else {
TownID town = IsTileOwner(t, OWNER_TOWN) ? ClosestTownFromTile(t, UINT_MAX)->index : 0;
- MakeRoadNormal(
- t,
- axis == AXIS_X ? ROAD_Y : ROAD_X,
- ROADTYPES_ROAD,
- town,
- GetTileOwner(t), OWNER_NONE
- );
+ /* MakeRoadNormal */
+ SetTileType(t, MP_ROAD);
+ _m[t].m2 = town;
+ _m[t].m3 = 0;
+ _m[t].m5 = (axis == AXIS_X ? ROAD_Y : ROAD_X) | ROAD_TILE_NORMAL << 6;
+ SB(_me[t].m6, 2, 4, 0);
+ _me[t].m7 = 1 << 6;
+ SetRoadOwner(t, RTT_TRAM, OWNER_NONE);
}
} else {
if (GB(_m[t].m5, 3, 2) == 0) {
@@ -1252,6 +1270,35 @@ bool AfterLoadGame()
}
}
+ if (IsSavegameVersionBefore(SLV_ROAD_TYPES)) {
+ /* Add road subtypes */
+ 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 = HasBit(_me[t].m7, 6) ? ROADTYPE_ROAD : INVALID_ROADTYPE;
+ RoadType tram_rt = HasBit(_me[t].m7, 7) ? ROADTYPE_TRAM : INVALID_ROADTYPE;
+
+ assert(road_rt != INVALID_ROADTYPE || tram_rt != INVALID_ROADTYPE);
+ SetRoadTypes(t, road_rt, tram_rt);
+ SB(_me[t].m7, 6, 2, 0); // Clear pre-NRT road type bits.
+ }
+ }
+ }
+
/* Elrails got added in rev 24 */
if (IsSavegameVersionBefore(SLV_24)) {
RailType min_rail = RAILTYPE_ELECTRIC;
@@ -1375,7 +1422,7 @@ bool AfterLoadGame()
Company *c;
FOR_ALL_COMPANIES(c) {
c->avail_railtypes = GetCompanyRailtypes(c->index);
- c->avail_roadtypes = GetCompanyRoadtypes(c->index);
+ c->avail_roadtypes = GetCompanyRoadTypes(c->index);
}
if (!IsSavegameVersionBefore(SLV_27)) AfterLoadStations();
@@ -1846,10 +1893,10 @@ bool AfterLoadGame()
}
} else if (IsTileType(t, MP_ROAD)) {
/* works for all RoadTileType */
- for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
+ FOR_ALL_ROADTRAMTYPES(rtt) {
/* update even non-existing road types to update tile owner too */
- Owner o = GetRoadOwner(t, rt);
- if (o < MAX_COMPANIES && !Company::IsValidID(o)) SetRoadOwner(t, rt, OWNER_NONE);
+ Owner o = GetRoadOwner(t, rtt);
+ if (o < MAX_COMPANIES && !Company::IsValidID(o)) SetRoadOwner(t, rtt, OWNER_NONE);
}
if (IsLevelCrossing(t)) {
if (!Company::IsValidID(GetTileOwner(t))) FixOwnerOfRailTrack(t);
@@ -2662,7 +2709,7 @@ bool AfterLoadGame()
if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) break;
- TrackStatus ts = GetTileTrackStatus(rv->tile, TRANSPORT_ROAD, rv->compatible_roadtypes);
+ TrackStatus ts = GetTileTrackStatus(rv->tile, TRANSPORT_ROAD, GetRoadTramType(rv->roadtype));
TrackBits trackbits = TrackStatusToTrackBits(ts);
/* Only X/Y tracks can be sloped. */
@@ -2871,8 +2918,8 @@ bool AfterLoadGame()
for (TileIndex t = 0; t < map_size; t++) {
if (!IsStandardRoadStopTile(t)) continue;
Owner o = GetTileOwner(t);
- SetRoadOwner(t, ROADTYPE_ROAD, o);
- SetRoadOwner(t, ROADTYPE_TRAM, o);
+ SetRoadOwner(t, RTT_ROAD, o);
+ SetRoadOwner(t, RTT_TRAM, o);
}
}