Chunnel patch 28393: Codechange: Rework GetOtherTunnelEnd proc.

https://www.tt-forums.net/viewtopic.php?p=1183416#p1183416
pull/16/head
HackaLittleBit 7 years ago committed by Jonathan G Rennison
parent ad070b91ea
commit 67e7d12eb7

@ -13,6 +13,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"
@ -563,6 +564,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.
@ -2009,6 +2029,29 @@ bool AfterLoadGame()
}
}
/* Tunnel pool has to be initiated before reservations. */
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()) return false;
Tunnel *t = new Tunnel(start_tile);
t->tile_s = end_tile;
DEBUG(misc, 0, "Tun start %#x, index=%#x", t->tile_n, t->index);
DEBUG(misc, 0, "Tun end %#x, index=%#x", t->tile_s, t->index);
_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. */
@ -2643,7 +2686,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

@ -36,20 +36,8 @@ Tunnel::~Tunnel()
*/
TileIndex GetOtherTunnelEnd(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;
Tunnel *t = Tunnel::GetByTile(tile);
return t->tile_n == tile ? t->tile_s : t->tile_n;
}

Loading…
Cancel
Save