From 9c0ccadbe09ea87a9480b48bfa63d382a99e2405 Mon Sep 17 00:00:00 2001 From: rubidium Date: Mon, 25 Jun 2007 08:24:03 +0000 Subject: [PATCH] (svn r10317) -Fix [FS#786]: acceleration not calculated properly when a train goes up a hill between tunnels. --- src/train_cmd.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index fee98b80d6..00a49fa6bd 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2529,22 +2529,28 @@ static void TrainEnterStation(Vehicle *v, StationID station) static byte AfterSetTrainPos(Vehicle *v, bool new_tile) { - /* need this hint so it returns the right z coordinate on bridges. */ - byte new_z = GetSlopeZ(v->x_pos, v->y_pos); - byte old_z = v->z_pos; - v->z_pos = new_z; + v->z_pos= GetSlopeZ(v->x_pos, v->y_pos); if (new_tile) { CLRBIT(v->u.rail.flags, VRF_GOINGUP); CLRBIT(v->u.rail.flags, VRF_GOINGDOWN); - if (new_z != old_z) { - TileIndex tile = TileVirtXY(v->x_pos, v->y_pos); - - /* XXX workaround, whole UP/DOWN detection needs overhaul */ - if (!IsTunnelTile(tile)) { - SETBIT(v->u.rail.flags, (new_z > old_z) ? VRF_GOINGUP : VRF_GOINGDOWN); + if ((v->u.rail.track == TRACK_X || v->u.rail.track == TRACK_Y)) { + /* Any track that isn't TRACK_X or TRACK_Y cannot be sloped. + * To check whether the current tile is sloped, and in which + * direction it is sloped, we get the 'z' at the center of + * the tile (middle_z) and the edge of the tile (old_z), + * which we then can compare. */ + static const int HALF_TILE_SIZE = TILE_SIZE / 2; + static const int INV_TILE_SIZE_MASK = ~(TILE_SIZE - 1); + + byte middle_z = GetSlopeZ((v->x_pos & INV_TILE_SIZE_MASK) | HALF_TILE_SIZE, (v->y_pos & INV_TILE_SIZE_MASK) | HALF_TILE_SIZE); + + /* For some reason tunnel tiles are always given as sloped :( + * But they are not sloped... */ + if (middle_z != old_z && !IsTunnelTile(TileVirtXY(v->x_pos, v->y_pos))) { + SETBIT(v->u.rail.flags, (middle_z > old_z) ? VRF_GOINGUP : VRF_GOINGDOWN); } } }