summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-06-25 08:24:03 +0000
committerrubidium <rubidium@openttd.org>2007-06-25 08:24:03 +0000
commite68892dcd406dcd54655c7d6f79a23ef35060b61 (patch)
treebbc61171c6dbe3ef70d23a3a10ec70b84a75feef /src
parent59dd90b76abe73b10395bbe56643e44f3352d8c3 (diff)
downloadopenttd-e68892dcd406dcd54655c7d6f79a23ef35060b61.tar.xz
(svn r10317) -Fix [FS#786]: acceleration not calculated properly when a train goes up a hill between tunnels.
Diffstat (limited to 'src')
-rw-r--r--src/train_cmd.cpp26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index fee98b80d..00a49fa6b 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);
}
}
}