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.cpp48
1 files changed, 47 insertions, 1 deletions
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index df1b4e44f..9696e390d 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -11,6 +11,7 @@
#include "../void_map.h"
#include "../signs_base.h"
#include "../depot_base.h"
+#include "../tunnel_base.h"
#include "../fios.h"
#include "../gamelog_internal.h"
#include "../network/network.h"
@@ -537,6 +538,25 @@ static inline bool MayHaveBridgeAbove(TileIndex t)
IsTileType(t, MP_WATER) || IsTileType(t, MP_TUNNELBRIDGE) || IsTileType(t, MP_OBJECT);
}
+TileIndex GetOtherTunnelBridgeEndOld(TileIndex tile)
+{
+ DiagDirection dir = GetTunnelBridgeDirection(tile);
+ TileIndexDiff delta = TileOffsByDiagDir(dir);
+ int z = GetTileZ(tile);
+
+ dir = ReverseDiagDir(dir);
+ do {
+ tile += delta;
+ } while (
+ !IsTunnelTile(tile) ||
+ GetTunnelBridgeDirection(tile) != dir ||
+ GetTileZ(tile) != z
+ );
+
+ return tile;
+}
+
+
/**
* Perform a (large) amount of savegame conversion *magic* in order to
* load older savegames and to fill the caches for various purposes.
@@ -1942,6 +1962,32 @@ bool AfterLoadGame()
}
}
+ /* Tunnel pool has to be initiated before reservations. */
+ if (IsSavegameVersionBefore(SLV_196)) {
+ for (TileIndex t = 0; t < map_size; t++) {
+ if (IsTunnelTile(t)) {
+ DiagDirection dir = GetTunnelBridgeDirection(t);
+ if (dir == DIAGDIR_SE || dir == DIAGDIR_SW) {
+ TileIndex start_tile = t;
+ TileIndex end_tile = GetOtherTunnelBridgeEndOld(start_tile);
+
+ if (!Tunnel::CanAllocateItem()) {
+ SetSaveLoadError(STR_ERROR_TUNNEL_TOO_MANY);
+ /* Restore the signals */
+ ResetSignalHandlers();
+ return false;
+ }
+
+ const Tunnel *t = new Tunnel(start_tile, end_tile, false);
+
+ _m[start_tile].m2 = t->index;
+ _m[end_tile].m2 = t->index;
+ }
+ }
+ }
+ }
+
+
/* Move the signal variant back up one bit for PBS. We don't convert the old PBS
* format here, as an old layout wouldn't work properly anyway. To be safe, we
* clear any possible PBS reservations as well. */
@@ -2545,7 +2591,7 @@ bool AfterLoadGame()
} else if (dir == ReverseDiagDir(vdir)) { // Leaving tunnel
hidden = frame < TILE_SIZE - _tunnel_visibility_frame[dir];
/* v->tile changes at the moment when the vehicle leaves the tunnel. */
- v->tile = hidden ? GetOtherTunnelBridgeEnd(vtile) : vtile;
+ v->tile = hidden ? GetOtherTunnelBridgeEndOld(vtile) : vtile;
} else {
/* We could get here in two cases:
* - for road vehicles, it is reversing at the end of the tunnel