(svn r21824) -Codechange: don't call GetSlopeZ() when the ground vehicle is on a flat tile

This commit is contained in:
smatz 2011-01-16 18:18:45 +00:00
parent 82346d4608
commit 92b90d877e
1 changed files with 13 additions and 1 deletions

View File

@ -112,9 +112,9 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
FORCEINLINE byte UpdateInclination(bool new_tile, bool turned)
{
byte old_z = this->z_pos;
this->z_pos = GetSlopeZ(this->x_pos, this->y_pos);
if (new_tile) {
this->z_pos = GetSlopeZ(this->x_pos, this->y_pos);
ClrBit(this->gv_flags, GVF_GOINGUP_BIT);
ClrBit(this->gv_flags, GVF_GOINGDOWN_BIT);
@ -132,6 +132,18 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
SetBit(this->gv_flags, (middle_z > old_z) ? GVF_GOINGUP_BIT : GVF_GOINGDOWN_BIT);
}
}
} else {
/* Flat tile, tile with two opposing corners raised and tile with 3 corners
* raised can never have sloped track ... */
static const uint32 never_sloped = 1 << SLOPE_FLAT | 1 << SLOPE_EW | 1 << SLOPE_NS | 1 << SLOPE_NWS | 1 << SLOPE_WSE | 1 << SLOPE_SEN | 1 << SLOPE_ENW;
/* ... unless it's a bridge head. */
if (IsTileType(this->tile, MP_TUNNELBRIDGE) || // the following check would be true for tunnels anyway
(T::From(this)->TileMayHaveSlopedTrack() && !HasBit(never_sloped, GetTileSlope(this->tile, NULL)))) {
this->z_pos = GetSlopeZ(this->x_pos, this->y_pos);
} else {
/* Verify that assumption. */
assert(this->z_pos == GetSlopeZ(this->x_pos, this->y_pos));
}
}
this->UpdateViewport(true, turned);