diff options
author | Darkvater <darkvater@openttd.org> | 2006-08-15 01:28:07 +0000 |
---|---|---|
committer | Darkvater <darkvater@openttd.org> | 2006-08-15 01:28:07 +0000 |
commit | d84a1dcf501227ec59a143e9d4b3d605aa8a3fcc (patch) | |
tree | b76790c98ca93bd560b4214f3cc861fdd80c132d | |
parent | 8fc2664237f87e29bbc20103142ae4281c637a93 (diff) | |
download | openttd-d84a1dcf501227ec59a143e9d4b3d605aa8a3fcc.tar.xz |
(svn r5906) -Fix [ 1203146 ]: GetVehicleOutOfTunnelTile always returned v->tile, now the exit-tile of the tunnel based on the vehicle's direction is correctly returned. Based on a patch by glx.
-rw-r--r-- | tunnelbridge_cmd.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c index 9d95de830..434f801b2 100644 --- a/tunnelbridge_cmd.c +++ b/tunnelbridge_cmd.c @@ -1425,15 +1425,27 @@ static uint32 VehicleEnter_TunnelBridge(Vehicle *v, TileIndex tile, int x, int y return 0; } +/** Retrieve the exit-tile of the vehicle from inside a tunnel + * Very similar to GetOtherTunnelEnd(), but we use the vehicle's + * direction for determining which end of the tunnel to find + * @param v the vehicle which is inside the tunnel and needs an exit + * @return the exit-tile of the tunnel based on the vehicle's direction */ TileIndex GetVehicleOutOfTunnelTile(const Vehicle *v) { - TileIndex tile; - TileIndexDiff delta = (v->direction & 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0); + TileIndex tile = v->tile; + DiagDirection dir = DirToDiagDir(v->direction); + TileIndexDiff delta = TileOffsByDir(dir); byte z = v->z_pos; - for (tile = v->tile;; tile += delta) { - if (IsTunnelTile(tile) && GetTileZ(tile) == z) break; - } + dir = ReverseDiagDir(dir); + do { + tile += delta; + } while ( + !IsTunnelTile(tile) || + GetTunnelDirection(tile) != dir || + GetTileZ(tile) != z + ); + return tile; } |