changeset 17087:4ce82f272b97 draft

(svn r21824) -Codechange: don't call GetSlopeZ() when the ground vehicle is on a flat tile
author smatz <smatz@openttd.org>
date Sun, 16 Jan 2011 18:18:45 +0000
parents 7986f89e6d4b
children d94ae66ace1f
files src/ground_vehicle.hpp
diffstat 1 files changed, 13 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ground_vehicle.hpp
+++ b/src/ground_vehicle.hpp
@@ -112,9 +112,9 @@
 	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 @@
 					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);